2012-01-25 29 views
5

aşağıdaki sütunları ile DataTable var:Sil satır (bazı dize)

ClientID date numberOfTransactions price 

ClientID dize türünde olduğunu ve içeriğini "A-" içermesini sağlamak için gereken ve tablodaki her değer için "N6".

bu ilk sütunu (ClientID) "A-" ve "N6" (bazı toplamları ve diğer gereksiz verileri) hem içermiyor DataTable tüm satırları silmek gerekir. Bu satırları özellikle DataTable'dan nasıl seçebilir ve silebilirim?

foreach (DataRow row in table.Rows) // Loop over the rows. 
    { 

     //Here should come part "if first column contains mentioned values 
    } 

Ben de her satırın ilk sütun için bu uygulamaya nasıl yardıma ihtiyacım bu

If (string.Contains("A-") == true && string.Contains("N6") == true) 

{ 
//Do something 
} 

biliyorum:

bunu biliyorum.

+1

Hangi sorguyu denediniz ..? Ayrıca DataBase'i SQL Server, MYSQL vb. kullanıyor musunuz? – MethodMan

+0

Bu soru çok belirsiz; bize daha fazla bilgi verir, lütfen –

+1

OP'nin sadece DataTable.Rows koleksiyonundan (bellekte) belirli DataRows'ları kaldırmak istediğine inanıyorum, bu yüzden verilerin nereden geldiğini bilmeniz gerçekten bir anlam ifade etmeyebilir (dolayısıyla karışıklık). –

cevap

6

bu deneyin:

DÜZENLEME: Eğer çalıştı, ben aptalca değil yaptığı şimdi deneyin böylece Tamamen ki son satırı berbat. =)

List<int> IndicesToRemove = new List<int>(); 
DataTable table = new DataTable(); //Obviously, your table will already exist at this point 
foreach (DataRow row in table.Rows) 
{ 
    if (!(row["ClientID"].ToString().Contains("A-") && row["ClientID"].ToString().Contains("N6"))) 
     IndicesToRemove.Add(table.Rows.IndexOf(row)); 
} 
IndicesToRemove.Sort(); 
for (int i = IndicesToRemove.Count - 1; i >= 0; i--) table.Rows.RemoveAt(IndicesToRemove[i]); 
+0

Mükemmel! Çok teşekkür ederim! –

2

bu kullanarak ilk sütun olarak (dolayısıyla ItemArray [0])

for(int i=0; i<dt.Rows.Count; i++) 
{ 
    temp = dt.Rows[i].ItemArray[0].ToString(); 

if (System.Text.RegularExpressions.Regex.IsMatch(temp, "A-", System.Text.RegularExpressions.RegexOptions.IgnoreCase) || System.Text.RegularExpressions.Regex.IsMatch(temp, "N6", System.Text.RegularExpressions.RegexOptions.IgnoreCase)) 
    { 
    dt.Rows.RemoveAt(i); 
    i--; 
    } 
} 

basit ve yalındır çözeltisi kullanarak Datatabe nesne ve ClientID olarak dt varsayarak deneyin. ..

+1

Bu şekilde yaparsanız, yinelemeniz sırasında satırların üzerinden geçme riskiyle karşı karşıya değil misiniz? Diyelim ki ben = 2 ve kaldırılması gereken bir satır bulursun. Diğer tüm satırların indekslerini ayarlayan satırı (2) kaldırırsınız - ancak şimdi i = 3, yani ** yeni ** (2) değerlendirilmediyse, değil mi? –

+0

Kabul edildiğinde, bir koleksiyondan çıkarıldığında, bu sorunların oluşmasına neden olur. – Chris

+0

@ C.Barlow, haklısınız. benim hatam. Bir satır daha eklemeyi unuttum: "i--;" Bu kadar. – Bravo

2

'un yardımcı olacağını umuyorum, hem Kod hem de Zaman satırlarında daha verimli olmalı, bunu deneyin :)

for(int x=0; x<table.Rows.Count;) 
{ 
    if (!table.Rows[x].ItemArray[0].contains("A-") && !table.Rows[x].ItemArray[0].contains("N6")) 
     table.Rows.RemoveAt(x); 
    else x++; 
} 

Mutlu Kodlama

1

Önsöz: C.Barlow's existing answer, müthiş bu sadece başka bir rota birisi sürebilir olduğunu.

Bu Eğer döngü orijinal tablonun tüm yol boyunca asla nerede (DataTable.Select() yöntemin yararlanarak) bunu yapmanın bir yolu şudur:

DataTable table = new DataTable(); // This would be your existing DataTable 
// Grab only the rows that meet your criteria using the .Select() method 
DataRow[] newRows = table.Select("ClientID LIKE '%A-%' AND ClientID LIKE '%N6%'"); 
// Create a new table with the same schema as your existing one. 
DataTable newTable = table.Clone(); 
foreach (DataRow r in newRows) 
{ 
    // Dump the selected rows into the table. 
    newTable.LoadDataRow(r.ItemArray, true); 
} 

Ve şimdi sadece bir DataTable var İstediğiniz satırlar. Gerekirse, bu noktada özgün tabloyu temizlemek olabilir ve yenisiyle içeriğiyle ile değiştirin:

table.Clear(); 
table = newTable.Copy(); 


Düzenleme: Bir bellek optimizasyon dün gece düşündüm, sadece üzerine yazabilirsiniz ihtiyacınız olan satırlara sahip olduğunuzda, mevcut tablo geçici tabloya olan ihtiyacı ortadan kaldırır.

DataTable table = new DataTable(); // This would be your existing DataTable 
// Grab only the rows that meet your criteria using the .Select() method 
DataRow[] newRows = table.Select("ClientID LIKE '%A-%' AND ClientID LIKE '%N6%'"); 
// Clear out the old table 
table.Clear(); 
foreach (DataRow r in newRows) 
{ 
    // Dump the selected rows into the table. 
    table.LoadDataRow(r.ItemArray, true); 
} 
+1

Nice! Verimlilik için +1 ve genellikle sassy olmak! –

+0

@ C.Barlow Haha, neden teşekkür ederim =) – jadarnel27

İlgili konular