2010-05-26 23 views
28

मैं डेटाटेबल पंक्तियों के लूप के भीतर विशिष्ट डेटारो को कैसे हटा सकता हूं जो कस्टम स्थिति को पूरा करते हैं -लेट्स का कहना है कि पंक्तियों की संख्या भी है-? (LINQ का उपयोग कर के बिना)डेटाटेबल में एकाधिक पंक्तियों को कैसे हटाएं?

धन्यवाद

उत्तर

49

यह आप 'नष्ट' से क्या मतलब है पर निर्भर करता है की तरह कुछ की कोशिश करो।

आप उन्हें नष्ट कर दिया के रूप में, के रूप में आप इसे अपने पाश में यात्रा सिर्फ प्रत्येक पंक्ति पर Delete() विधि कॉल मतलब है। हटाए जाने के लिए आपको डेटा तालिका पर AcceptChanges() पर कॉल करने की आवश्यकता है - संभावित रूप से आपके डेटाबेस को अपडेट करने के बाद (यदि कोई शामिल है)।

foreach(DataRow row in someTable.Rows) 
{ 
    if(/* your condition here */) 
     row.Delete(); 
} 
someTable.AcceptChanges(); 

तुम्हारा मतलब तो DataTable से हटाने, तो आपके पास दो गुजरता में ऐसा करने की जरूरत है:

List<DataRow> rowsToDelete = new List<DataRow>(); 
foreach(DataRow row in someTable.Rows) 
{ 
    if(/* your condition here */) 
    { 
     rowsToDelete.Add(row); 
    } 
} 

foreach(DataRow row in rowsToDelete) 
{ 
    someTable.Rows.Remove(row); 
} 

यह उनका कहना है कि आप हमेशा पंक्तियों को हटाने के लिए पहली विधि का उपयोग कर सकते हैं लायक है - Deleted के रूप में पंक्तियों को चिह्नित करने के बाद और फिर परिवर्तनों को स्वीकार करने से उन्हें तालिका से स्वचालित रूप से हटा दिया जाएगा। लेकिन, कभी-कभी Rows संग्रह से DataRow ऑब्जेक्ट को निकालने के लिए यह अधिक स्पष्ट और कुशल है।

+0

+1 को हटा दें, तो इससे थोड़ा चिंता हो रही है !! – Jithu

+4

यदि आप एलबीशकिन के जैसा ही करते हैं, तो आप निम्नानुसार देखेंगे: संग्रह संशोधित किया गया था; गणना ऑपरेशन निष्पादित नहीं हो सकता है। तो यह गलत है। – Szjdw

+1

जब तक आप कॉल करते हैं .कृतियों को चिह्नित करने से पहले पंक्तियों को चिह्नित करने से पहले। (फ़ोरैच लूप से पहले) तो आपको "संग्रह संशोधित किया गया था; गणना ऑपरेशन निष्पादित नहीं हो सकता" त्रुटि प्राप्त नहीं होगी। त्रुटि प्रकट होती है क्योंकि लंबित परिवर्तन हैं जिन्हें स्वीकार करने की आवश्यकता है। यदि आप लूप के लिए उपयोग करते हैं तो इससे कोई फर्क नहीं पड़ता है, लेकिन उस स्थिति में पीछे की ओर फिर से चलना सबसे अच्छा होगा। – Soenhay

8

इस उदाहरण

DataTable table = new DataTable(); 
table.Columns.Add("Foo",typeof(int)); 
for (int i = 0; i < 10; i++) 
    table.Rows.Add(i); 

for (int i = table.Rows.Count -1; i >=0; i--) 
{ 
    // sample removes all even foos 
    if ((int)table.Rows[i]["Foo"] % 2 == 0) 
     table.Rows.RemoveAt(i); 
} 
+0

पीछे की ओर यात्रा indicies बनाए रखने के लिए लिए +1 – riffnl

+0

भी एक आगे पाश कर सकता है (0 -> गणना -1) यदि आप के लिए कदम 'i ++' अंदर पाश और केवल वेतन वृद्धि के लिए जब नहीं हटाया जा रहा । 'अगर (...) इस महान स्पष्टीकरण के लिए i ++' – CuppM

0

चयन() के परिणाम पर पुनरावृत्ति करने का प्रयास करें। यह सुंदर अन्य उत्तर के समान है, लेकिन मैं इसे सबसे सीधा

DataRow[] r = table.Select(); 
for (int i = 0; i < r.Length; i++) 
{ 
    if (i % 2 == 0) 
     r[i].Delete(); 
} 
-2

कोशिश इस

foreach(DataRow oRow in YourDataTable.Rows) 
{ 
    if ("Check You Condition") 
    { 
     YourDataTable.Rows.Remove(oRow); 
    } 
} 
+3

आप फ़ोरैच लूप के साथ इसके माध्यम से पुनरावृत्ति करते समय संग्रह को संशोधित नहीं कर सकते हैं। –

4

दूसरा रास्ता है

DataRow[] DrArrCheck = DataTableName.Select("ID > 0"); 
    foreach(DataRow DrCheck in DrArrCheck) 
    { 
     DataTableName.Rows.Remove(DrCheck); 
    } 
1
public static void DeleteRowsFromDataTable(DataTable dataTable, string columnName, string columnValue) 
     { 
      IEnumerable<DataRow> dataRows = (from t in dataTable.AsEnumerable() 
              where t.Field<string>(columnName) == columnValue 
              select t); 
      foreach (DataRow row in dataRows) 
       dataTable.Rows.Remove(row); 
     } 
-1

यह मैं कैसे किया है जब मैं इस मुद्दे में भाग गया।

Dim index As Integer = 0 
Dim count As Integer = resultsDT.Rows.Count - 1 
For i As Integer = 0 To count 
    If resultsDT.Rows(index).Item("something") = "something" Then        
     resultsDT.Rows(index).Delete() 
     resultsDT.AcceptChanges() 
     index = index - 1 
    End If 
    index = index + 1 
    i = i + 1 
Next 
0

मैं हमेशा LBushkin की 'दो चरण "दृष्टिकोण का इस्तेमाल किया और मैं अंत में फैसला किया कि यह यह इसके लिए एक समारोह लिखने के लायक था:

public delegate bool DataRowComparer(DataRow dr); 

    public static void RemoveDataRows(DataTable table, DataRowComparer drc) 
    { 
     List<DataRow> RowsToRemove = new List<DataRow>(); 
     foreach (DataRow dr in table.Rows) 
      if (drc(dr)) 
       RowsToRemove.Add(dr); 
     foreach (DataRow dr in RowsToRemove) 
      table.Rows.Remove(dr); 
    } 

और अब मैं कोड की एक लाइन के साथ पंक्तियों को हटा सकते हैं (उदाहरण के लिए):

RemoveDataRows(dt, row => row["StringVal"].ToString() == "B" && (Int16)(row["NumberVal"]) >= 4); 

मामले में यह किसी को भी मदद करता है ...

(और किसी भी तरीके furthe के लिए आर संक्षिप्त सराहना कर रहे हैं।)

4

आप ऊपर प्रस्तावित उन की तुलना में कम समाधान, परिणामों की सूची से अधिक पाशन, और sub(x) की तरह एक लैम्ब्डा का उपयोग कर उन पंक्तियों में से प्रत्येक को निकालने का प्रयास करें।

dt.Select("Column1 > 0").ToList.ForEach(Sub(x) dt.Rows.Remove(x)) 
1

डेटाबेस या तो datatable.Rows.Remove (पंक्ति) या row.Delete करने के लिए की तुलना में कॉपी करने के लिए (100,000 से बाहर उदाहरण 50,000 के लिए) एकाधिक पंक्तियों को हटाने के लिए यह है बहुत जल्दी()। उदाहरण के लिए:

DataRow[] rowsToKeep = datatable.Select("ID > 50000"); 
DataTable tempDataTable= rowsToKeep.CopyToDataTable; 
dataTable.Clear(); 
dataTable.Merge(tempDataTable); 
tempDataTable.Dispose(); 
संबंधित मुद्दे