C# 如何使用lambda表达式筛选数据行?
如何使用Col1=“MyValue”搜索数据表中的行 我在想C# 如何使用lambda表达式筛选数据行?,c#,dataset,lambda,C#,Dataset,Lambda,如何使用Col1=“MyValue”搜索数据表中的行 我在想 Assert.IsTrue(dataSet.Tables[0].Rows. FindAll(x => x.Col1 == "MyValue" ).Count == 1); 但那当然不行 您编写的代码检查只有一行符合您的搜索条件。 如果确实需要行,请删除断言和计数为什么使用lambda而不使用 您可以使用来执行此操作: Assert.IsTrue(dataSet.Tables[0].AsEnumerable().Wher
Assert.IsTrue(dataSet.Tables[0].Rows.
FindAll(x => x.Col1 == "MyValue" ).Count == 1);
但那当然不行 您编写的代码检查只有一行符合您的搜索条件。 如果确实需要行,请删除
断言
和计数
为什么使用lambda而不使用
您可以使用来执行此操作:
Assert.IsTrue(dataSet.Tables[0].AsEnumerable().Where(
r => ((string) r["Col1"]) == "MyValue").Count() == 1);
注意,您也可以在不调用Assert的情况下执行此操作:
dataSet.Tables[0].AsEnumerable().Where(
r => ((string) r["Col1"]) == "MyValue").Single();
如果行数不等于一(因此,调用Single
),则将引发异常,未处理的异常将使测试用例失败。就我个人而言,我喜欢后者,因为它有更清晰的语义
上述内容可进一步缩减为:
dataSet.Tables[0].AsEnumerable().Single(
r => ((string) r["Col1"]) == "MyValue");
此外,您还可以利用上的简化对字段的类型安全访问(以及提供在.NET中转换为空对应项的额外好处):
dataSet.Tables[0].AsEnumerable().Single(
r=>r.Field(“Col1”)==“MyValue”);
您可以使用数据表的Select
方法,或者使用表上的DefaultDataView
的Filter属性来执行此操作
对于选择方法:
var rows = dataSet.Tables[0].Select("Col1 = 'MyValue'");
对于DefaultView
过滤器:
dataSet.Tables[0].DefaultView.Fitler = "Col1 = 'MyValue'";
foreach (var drv in dataSet.Tables[0].DefaultView)
{
// Do your processing
}
您可以尝试以下方法:
var b=datatable.AsEnumerable.where(p=> p.Field<string>
("column_name")=="desire_value").CopyToDataTable()
var b=datatable.AsEnumerable.where(p=>p.Field
(“列名称”)==“期望值”).CopyToDataTable()
您是要返回匹配的行,还是只计算有多少行?这可能不是询问者想要的,但我发现它很有用。应该只有1个等号
dataSet.Tables[0].DefaultView.Fitler = "Col1 = 'MyValue'";
foreach (var drv in dataSet.Tables[0].DefaultView)
{
// Do your processing
}
var b=datatable.AsEnumerable.where(p=> p.Field<string>
("column_name")=="desire_value").CopyToDataTable()