2011-03-09 14 views
29

मैं एक datatable, dtFoo है, और पंक्तियों को एक कुछ मानदंडों को पूरा की गिनती प्राप्त करना चाहते हैं को पूरा में पंक्तियों की गिनती हो रही है।एक datatable जो निश्चित सीमा

संपादित करें: यह डेटा एक डेटाबेस में संग्रहीत नहीं है, इसलिए एसक्यूएल का उपयोग कर एक विकल्प नहीं है।

अतीत में, मैं निम्नलिखित दो विधियों का उपयोग किया है यह पूरा करने के:

विधि 1

int numberOfRecords = 0; 
DataRow[] rows; 

rows = dtFoo.Select("IsActive = 'Y'"); 
numberOfRecords = rows.Length; 

Console.WriteLine("Count: " + numberOfRecords.ToString()); 

विधि 2

int numberOfRecords = 0; 

foreach (DataRow row in dtFoo.Rows) 
{ 
    if (row["IsActive"].ToString() == "Y") 
    { 
     numberOfRecords++; 
    } 
} 

Console.WriteLine("Count: " + numberOfRecords.ToString()); 

मेरे दुकान कोशिश कर रहा है कुछ चीजों पर मानकीकृत करने के लिए और यह एक मुद्दा है जो आया है। मैं सोच रहा हूं कि इनमें से कौन सी विधियां प्रदर्शन (और क्यों!) के मामले में सर्वोत्तम हैं, साथ ही साथ आमतौर पर उपयोग की जाने वाली चीज़ों के अनुसार।

इसके अलावा, वांछित परिणाम प्राप्त करने के बेहतर तरीके हैं?

उत्तर

50

एक आसान तरीका पूरा करने के लिए इस संयोजन है क्या एक भी बयान में मूल पोस्ट में पोस्ट किया गया:

int numberOfRecords = dtFoo.Select("IsActive = 'Y'").Length; 

यह पूरा करने के लिए एक अन्य तरीका Linq तरीकों का उपयोग कर रहा है:

int numberOfRecords = dtFoo.AsEnumerable().Where(x => x["IsActive"].ToString() == "Y").ToList().Count; 

नोट इस सहित की आवश्यकता है System.Linq

+1

उत्कृष्ट समाधान, क्या आप कृपया मुझे कुछ स्रोत बता सकते हैं जहां मैं LINQ के कई उदाहरण देख सकता हूं? –

+0

@Saluce, dtFoo.AsEnumerable()। कहाँ (expr) गणनीय कन्वर्ट करने के लिए के रूप में हम dtFoo.Where (expr) का उपयोग कर सकते कोई जरूरत नहीं करता है भी पहले से ही गणनीय –

+1

@Sunny_Sid यह सही नहीं है। आपको 'एन्यूमेरेबल' का उपयोग करने के लिए स्पष्ट रूप से 'गणना करने योग्य 'में परिवर्तित करना होगा। – saluce

0

डेटा एक डेटाबेस में संग्रहीत है, तो यह सब डेटा प्राप्त करने के बजाय डेटाबेस के लिए क्वेरी भेजने के लिए और स्मृति में क्वेरी करने के लिए तेजी से हो जाएगा।

करने के लिए यह डेटासेट से LINQ हो जाएगा एक तीसरा रास्ता है, लेकिन मैं इन 3 तरीकों में से किसी भी शक के प्रदर्शन में बहुत भिन्न होते हैं।

+0

यह डेटा एक डेटाबेस में संग्रहीत नहीं है की कोशिश करो। मैंने इसे प्रतिबिंबित करने के लिए अपनी मूल प्रविष्टि संपादित की। – Sesame

2

सुनिश्चित नहीं हैं कि अगर यह तेजी से होता है, लेकिन कम से कम यह है कम :)

int rows = new DataView(dtFoo, "IsActive = 'Y'", "IsActive", 
    DataViewRowState.CurrentRows).Table.Rows.Count; 
+0

'int पंक्तियां = नया डेटाव्यू (डीटीएफयू," IsActive = 'Y' "," IsActive ", DataViewRowState.CurrentRows) .able.Rows.Count;' int पंक्तियों = dtFoo से छोटा 'चयन करें ("IsActive = 'वाई') लंबाई;। '? – PedroC88

+0

@ पेड्रोसी 88: यह नहीं है; यह मूल पोस्टर के तरीकों से छोटा है। – Cosmin

3
int numberOfRecords = 0; 

numberOfRecords = dtFoo.Select().Length; 

MessageBox.Show(numberOfRecords.ToString()); 
+2

@ तिल ने पहले ही डीटीएफयू का वर्णन किया है। प्रश्न में दृष्टिकोण का चयन करें। इसके अलावा, सवाल कुछ मापदंडों के आधार पर गिनती, रिकॉर्ड की कुल संख्या को पुन: प्राप्त नहीं के बारे में था। – Alexander

+0

मेरे लिए उपयोगी धन्यवाद –

0
object count =dtFoo.Compute("count(IsActive)", "IsActive='Y'"); 
5
int numberOfRecords = DTb.Rows.Count; 
int numberOfColumns = DTb.Columns.Count; 
1

इस

int numberOfRecords = dtFoo.Select("IsActive = 'Y'").Count<DataRow>();  
Console.WriteLine("Count: " + numberOfRecords.ToString());