C# 如何使用lambda表达式筛选数据行?

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

如何使用Col1=“MyValue”搜索数据表中的行

我在想

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()