2009-10-19 19 views
35

मैं सी # सीखने की प्रक्रिया में व्यस्त हूं और यह अब तक अच्छी तरह से चल रहा है। हालांकि मैंने अभी अपना पहला "क्या कहा?" पल।डेटाटेबल, पंक्तियों को सशर्त रूप से कैसे हटाएं

डेटाटेबल न केवल विशिष्ट संग्रह व्यवहार के माध्यम से, बल्कि डेटाटेबल के माध्यम से, इसके पंक्ति संग्रह में यादृच्छिक पंक्ति पहुंच प्रदान करता है। चयन करें। हालांकि मैं DataRow.Delete को इस क्षमता को बांधने में सक्षम नहीं लग सकता। अब तक ऐसा लगता है कि मुझे टेबल से एक या एक से अधिक पंक्तियों को सशर्त रूप से हटाने के लिए ऐसा करने की आवश्यकता है।

int max = someDataTable.Rows.Count - 1; 
for(int i = max; i >= 0; --i) 
{ 
    if((int)someDataTable.Rows[i].ItemArray[0] == someValue) 
    { 
     someDataTable.Rows[i].BeginEdit(); 
     someDataTable.Rows[i].Delete(); 
    } 
    else 
     break; 
} 
someDataTable.AcceptChanges(); 

लेकिन मैं इस कोड से खुश नहीं हूं। न तो मैं आश्वस्त हूँ। मेरा कुछ छूट रहा है। क्या मुझे वास्तव में पंक्तियों के संग्रह को क्रमशः हिट करने के लिए मजबूर होना पड़ता है यदि मुझे सशर्त रूप से एक या अधिक पंक्तियां हटाना पड़े?

(के लिए। मैं datatable के अंत से हटा रही हूं उल्टे आपत्ति नहीं है। तो यह ठीक है)

उत्तर

66

आप डाटासेट और फिर पाश चयनित पंक्तियों उन्हें हटाने स्थापित करने के लिए क्वेरी कर सकते हैं।

var rows = dt.Select("col1 > 5"); 
foreach (var row in rows) 
    row.Delete(); 

... और आप भी आसान बनाने के लिए कुछ विस्तार तरीकों बना सकते हैं ...

myTable.Delete("col1 > 5"); 

public static DataTable Delete(this DataTable table, string filter) 
{ 
    table.Select(filter).Delete(); 
    return table; 
} 
public static void Delete(this IEnumerable<DataRow> rows) 
{ 
    foreach (var row in rows) 
     row.Delete(); 
} 
+0

आह! मेरे लिए नहीं हुआ चयन() डेटाटेबल पंक्तियों का संदर्भ वापस करेगा। मुझे पता था कि मुझे कुछ याद आना था। बहुत बहुत धन्यवाद! –

+0

बहुत अच्छा समाधान, इसने डेटाटेबल की मेरी समस्या भी हल की। ​​ऑर्डर बदलने का चयन करें। – Signcodeindie

+0

ग्रेट सॉल्यूशन मैथ्यू – Ravia

8

मैं एक खिड़कियों इस कोशिश करने के लिए काम बॉक्स नहीं है, लेकिन मुझे लगता है कि आप उपयोग कर सकते हैं एक डेटा व्यू और ऐसा कुछ करें:

DataView view = new DataView(ds.Tables["MyTable"]); 
view.RowFilter = "MyValue = 42"; // MyValue here is a column name 

// Delete these rows. 
foreach (DataRowView row in view) 
{ 
    row.Delete(); 
} 

मैंने इसका परीक्षण नहीं किया है, हालांकि। आप इसे आज़मा सकते हैं।

+0

मैंने कोशिश की और यह काम किया। हालांकि मैं चयन दृष्टिकोण पसंद करते हैं। लेकिन ध्यान में रखने के लिए अच्छी बात है। धन्यवाद :) +1 –

35

यहाँ एक एक लाइनर LINQ का उपयोग कर का चयन करें और तार के किसी भी चलाने के समय मूल्यांकन से परहेज है:

someDataTable.Rows.Cast<DataRow>().Where(
    r => r.ItemArray[0] == someValue).ToList().ForEach(r => r.Delete()); 
+1

मुझे वास्तव में यह समाधान पसंद आया- बहुत अच्छा - धन्यवाद! – MDV2000

+2

कभी-कभी, कॉल फ़ंक्शन को याद रखें कुछ DataTable.AcceptChanges(); –

+1

@ ग्रेवॉल्फ को हटाने के बाद यदि आप डेटाबेस में परिवर्तन लिखना चाहते हैं, तो AcceptChanges को कॉल न करें! AcceptChanges सभी नई/अपडेट की गई पंक्तियों को अपरिवर्तित के रूप में चिह्नित करेगा, इस प्रकार डेटा एडाप्टर सोचेंगे कि कोई बदलाव नहीं है और डेटाबेस पर कुछ भी नहीं लिखेंगे .Update()। –

0

एक्सटेंशन विधि Linq

पर
public static void DeleteRows(this DataTable dt, Func<DataRow, bool> predicate) 
{ 
    foreach (var row in dt.Rows.Cast<DataRow>().Where(predicate).ToList()) 
     row.Delete(); 
} 

फिर आधारित का उपयोग करें:

DataTable dt = GetSomeData(); 
dt.DeleteRows(r => r.Field<double>("Amount") > 123.12 && r.Field<string>("ABC") == "XYZ"); 
संबंधित मुद्दे