Проверьте, существует ли строка в DataTable?

У меня есть datatable и строка. Я хочу импортировать строку в datatable, только если она не существует в datatable.

Как я могу это сделать?

7 ответов


если вы используете типизированный DataSet, т. е. объявленный во время разработки, "linq Contains method" принимает типизированный DataRow. Значение по умолчанию IEqualityComparer будет сравнивать все значения в DataRow. (Что обычно бесполезно, так как у вас должен быть определенный ключ).

DataSet1 ds = new DataSet1();
DataSet1.DataTable1Row row = ds.DataTable1.AddDataTable1Row(bla, bla);
bool exists = ds.DataTable1.Contains(row);

Если вы хотите проверить все cells на DataRow, вы можете попробовать эту функцию:

bool ContainDataRowInDataTable(DataTable T,DataRow R)
{
    foreach (DataRow item in T.Rows)
    {
        if (Enumerable.SequenceEqual(item.ItemArray, R.ItemArray))
            return true;
    }
    return false;
}

вы можете использовать LINQ для проверки наличия строки в datatable. Следуйте этому решению и замените " id " первичным ключом строки, с помощью которого можно однозначно идентифицировать строку в таблице.

DataRow dr = null; // assign your DR here
DataTable dt = new DataTable(); // assign Datatable instance here.
var k = (from r in dt.Rows.OfType<DataRow>()  where r["id"].ToString() == dr["id"].ToString() select r).FirstOrDefault();
if(k != null)
{  // Row is present }

можно использовать Contains ниже

if(DataTable.Columns.Contains("RowName"))
{
  //Do some stuffs here
}

пробовал все ответы здесь, но не работал, поэтому я сделал что-то для себя, что работает в моем случае. Код довольно прост, он проверяет, существует ли строка, которую вы хотите добавить, в datatable - если она не существует в datatable, добавьте ее.

// fill dt with information
DataTable dt = new DataTable();

// create a new row and fill it with information
DataRow dr = dt.NewRow();

// distinct
bool isDistinct = true;
for (int i=0; i < dt.Rows.Count; i++)
{
  // check if both rows are equal
  if (Enumerable.SequenceEqual(dt.Rows[i].ItemArray, dr.ItemArray))
  {
    // it already exists
    isDistinct = false;
    break;
  }
}

if (isDistinct)
{
  dt.Rows.Add(dr);
}

if ( Datatable1.Rows[NumOfRow].ToString().Deleted == "Deleted")

вы должны проверить существование строки, сравнивая первичные ключи:

static bool RowExists(DataTable table, DataRow row)
{
    var pk = table.PrimaryKey
                .Select(column => row[column, DataRowVersion.Original])
                .ToArray();

    return table.Rows.Contains(pk);
}

причина в том,DataRow что вы пытаетесь проверить по существующему DataTable, в реальных сценариях, другой экземпляр класса по сравнению с DataRaw в таблице, даже когда же DataRaw уже существует в DataTable. Обычное равенство .NET-сравнение не работает должным образом в этих сценариях. Это включает DataTable.Contains(...) метод.

чтобы правильно проверить DataRaw наличие в таблице, первичный ключ задан DataRaw нужно искать в таблице.