Удалить строку из таблицы данных, где первый столбец не содержит (некоторая строка) - PullRequest
5 голосов
/ 25 января 2012

У меня есть DataTable со следующими столбцами:

ClientID date numberOfTransactions price

ClientID имеет тип string, и я должен убедиться, что его содержимое включает «A-» и «N6» для каждого значения в таблице.

Мне нужно удалить все строки из таблицы данных, где этот первый столбец (ClientID) не содержит ни «A-» , ни «N6» (некоторые итоги и другие ненужные данные).Как я могу выбрать и удалить эти строки конкретно из таблицы данных?

Я знаю это:

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

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

Я также знаю это

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

{
//Do something
}

Мне нужна помощь, какреализовать это для первого столбца каждой строки.

Ответы [ 4 ]

6 голосов
/ 25 января 2012

Попробуйте это:

РЕДАКТИРОВАТЬ: Полностью испортил эту последнюю строку, так что если вы попробовали, попробуйте сейчас, когда я сделал это не глупо =)

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]);
2 голосов
/ 25 января 2012

это должно быть более эффективно, как в строках кода, так и во времени, попробуйте это:)

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++;
}

Happy Coding

2 голосов
/ 25 января 2012

попробуйте использовать это,

, принимая dt в качестве объекта Datatabe и ClientID в качестве первого столбца (следовательно, используя 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--;
   }
 }

Простое и прямое решение ...надеюсь, это поможет

1 голос
/ 26 января 2012

Предисловие: Существующий ответ С.Барлоу потрясающий, это просто еще один маршрут, по которому можно пойти.

Это один из способов сделать это, когда вам никогда не придется проходить весь цикл по исходной таблице (используя метод DataTable.Select()):

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);
}

А теперь у вас есть DataTable только с теми строками, которые вы хотите. При необходимости в этот момент вы можете очистить исходную таблицу и заменить ее содержимым новой:

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

<ч /> Редактировать: Я думал об оптимизации памяти вчера вечером, вы можете просто перезаписать существующую таблицу, как только у вас появятся нужные вам строки, что исключает необходимость во временной таблице.

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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...