如何将两个LINQ合并为一个?

时间:2020-04-13 01:40:04

标签: c# linq

我有两个Linq查询

dTable.AsEnumerable()
      .Where(s => Convert.ToString(s["OccpStat"]).ToLower().Equals("i"))
      .ToList()
      .ForEach(D => D.SetField("OccpStat", Convert.ToBoolean(1)));

dTable.AsEnumerable()
      .Where(s => Convert.ToString(s["OccpStat"]) != ("True"))
      .ToList()
      .ForEach(D => D.SetField("OccpStat", Convert.ToBoolean(0)));

基本上,它可以与DataTable一起使用,如果单元格为“ I”,则更改单元格的值,如果不是“ I”,则更改为1,然后更改0

是否有可能以某种方式将它们合并到一个LINQ中并仅向其中插入一个If语句,而不是使用两个linq查询在同一张表中循环两次?

1 个答案:

答案 0 :(得分:1)

提供的示例在DataTable中循环四次:调用ToList时两次,调用ForEach时两次。

下一种方法可用于将两个给定的LINQ查询重写为一个,它将通过DataTable循环两次:

dTable.AsEnumerable()
    // First loop.
    .ToList()
    // Second loop.
    .ForEach(D => 
    {
        string OccpStat = Convert.ToString(D["OccpStat"]);

        if (OccpStat.ToLower().Equals("i"))
            D.SetField("OccpStat", Convert.ToBoolean(1));
        else
            D.SetField("OccpStat", Convert.ToBoolean(0));
    });

如果您只想通过DataTable循环一次,则应该声明自己的ForEach方法并删除对ToList方法的调用:

public static void ForEach<T>(this IEnumerable<T> items, Action<T> action)
{
    foreach (T t in items)
        action(t);
}

...

dTable.AsEnumerable()
    .ForEach(D => 
    {
        string OccpStat = Convert.ToString(D["OccpStat"]);

        if (OccpStat.ToLower().Equals("i"))
            D.SetField("OccpStat", Convert.ToBoolean(1));
        else
            D.SetField("OccpStat", Convert.ToBoolean(0));
    });
相关问题