首页 > 解决方案 > 如何将两个 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 查询在同一个表中循环两次?

标签: c#linq

解决方案


提供了四次采样循环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));
    });

推荐阅读