我有两个DataTables,我正在尝试确定表是否包含列表中的字符串,一次一个字符串。如果任一表包含字符串列表中的每个字符串,则返回true,否则返回false。
示例:
public static bool MyMethod()
{
DataTable table1 = GetMyTable1();
DataTable table2 = GetMyTable2();
List<string> requiredList = new List<string>();
requiredList.Add("foo");
requiredList.Add("bar");
requiredList.Add("foobar");
int counter = 0;
foreach (DataRow row in table1.Rows)
{
if (requiredList.Contains(row["ColumnName"].ToString()))
{
counter++;
}
}
foreach (DataRow row in table2.Rows)
{
if (requiredList.Contains(row["ColumnName2"].ToString()))
{
counter++;
}
}
return (counter == requiredList.Count);
}
列表和数据表不会有重复项,我只关心一列。表之间也不会有任何重复。
有更有效的方法吗?有没有办法同时搜索两个数据表的列而不是两个foreach?
答案 0 :(得分:1)
如果您不想循环,还有其他选项可以从DataTables获取行。您可以尝试.Select()
。
foreach(string req in requiredList)
{
DataRow[] rowsTable1 = table.Select("ColumnName LIKE " + req);
DataRow[] rowsTable2 = table.Select("ColumnName LIKE " + req);
counter = counter + rowsTable1.Length + rowsTable2.Length;
}
当然,您可以使用任何最适合您所需字符串比较的运算符替换过滤器字符串中的LIKE
。
我无法确定这会更快,但至少看起来更短。
答案 1 :(得分:1)
不确定这是否是最佳答案,但您可以从每个表中选择匹配的行,然后按以下方式计算这些行:
string listItems = String.Join(",", requiredList);
DataRow[] table1Rows = table1.Select("ColumnName IN (" + listItems + ")");
DataRow[] table2Rows = table2.Select("ColumnName IN (" + listItems + ")");
counter = table1Rows.Length + table2Rows.Length;
答案 2 :(得分:0)
你可以尝试做的是做一个for
循环,迭代到max(table1.Rows,table2.Rows)
,如前面的答案所说。
还提出if
声明来处理超出界限