检查字符串/记录是否存在于数据表中

11
我有一个字符串,我需要检查 DataTable dtPs.Rows 中的任何一列 "item_manuf_id" 是否等于某个特定值。我可以循环遍历所有行并进行比较。
String id = dtPs.Rows[number]["item_manuf_id"].ToString()
if ("some value".equals(id)) etc.

但我想知道是否有办法检查 DataTable 是否包含该记录


冒昧重复一下,我假设OP正在寻找确保常数时间复杂度的解决方案,而不是线性时间复杂度,这似乎是被接受的答案所提供的。 - Fabien Teulieres
4个回答

19

类似于这样

 string find = "item_manuf_id = 'some value'";
 DataRow[] foundRows = table.Select(find);

很棒的解决方案。顺便提一下,如果您的列名包含空格(即使这与OP的问题没有直接关系),请允许我建议使用括号的通用查询格式:string find = string.Format("[{0}] = '{1}'", columnName, valueToFind); - Fabien Teulieres

5

如果item_manuf_id是主键,请使用Find方法:

var result = dtPs.Rows.Find("some value");

如果你只想知道值是否存在,那么使用Contains方法即可。
if (dtPs.Rows.Contains("some value"))
{
  ...
}

主键限制同样适用于Contains

4
你可以循环遍历DataTable的每一行并检查其值。
在使用IEnumerable时,我非常喜欢使用foreach循环。这使得处理每一行非常简单和清晰。
DataTable dtPs = // ... initialize your DataTable
foreach (DataRow dr in dtPs.Rows)
{
    if (dr["item_manuf_id"].ToString() == "some value")
    {
        // do your deed
    }
}

您也可以为您的DataTable使用PrimaryKey。这有很多好处,但是通常需要在使用之前定义一个。

一个使用PrimaryKey的例子可以在http://msdn.microsoft.com/en-us/library/z24kefs8(v=vs.80).aspx找到。

DataTable workTable = new DataTable("Customers");

// set constraints on the primary key
DataColumn workCol = workTable.Columns.Add("CustID", typeof(Int32));
workCol.AllowDBNull = false;
workCol.Unique = true;

workTable.Columns.Add("CustLName", typeof(String));
workTable.Columns.Add("CustFName", typeof(String));
workTable.Columns.Add("Purchases", typeof(Double));

// set primary key
workTable.PrimaryKey = new DataColumn[] { workTable.Columns["CustID"] };

一旦您定义了主键并填充了数据,您可以使用Find(...)方法获取与您的主键匹配的行。

请查看http://msdn.microsoft.com/en-us/library/y06xa2h1(v=vs.80).aspx

DataRow drFound = dtPs.Rows.Find("some value");
if (drFound["item_manuf_id"].ToString() == "some value")
{
    // do your deed
}

最后,您可以使用Select()方法在DataTable中查找数据,该方法也可以在http://msdn.microsoft.com/en-us/library/y06xa2h1(v=vs.80).aspx找到。

String sExpression = "item_manuf_id == 'some value'";
DataRow[] drFound;
drFound = dtPs.Select(sExpression);

foreach (DataRow dr in drFound)
{
    // do you deed. Each record here was already found to match your criteria
}

2
我正在努力摆脱这个。 - Andrew

2

我认为如果您的"item_manuf_id"是DataTable的主键,您可以使用Find方法...

string s = "stringValue";
DataRow foundRow = dtPs.Rows.Find(s);
if(foundRow != null) {
 //You have it ...
 }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接