Linq Query toList()为空,但foreach有效

时间:2016-04-27 14:58:24

标签: c# linq

我有以下Linq查询:

IEnumerable<Network> net = from file in Directory.GetFiles(folder+ @"\network")
                           from lines in File.ReadLines(file).Skip(1)
                           let row = lines.Split(',')           
                           select new Network
                           {
                               networkname = getnetwork(row),
                               ...
                               networkdate = getnetworkdate(row)
                           };

当我在其上使用toList()时,列表为空,但是当我使用foreach循环时,我使用空List并添加每个项目,但事实并非如此。我在这个查询中犯了错误,或者这个奇怪的行为会有不同的来源吗?

更新: 我在这样的扩展方法中使用它: 这不起作用:

public static void FillFromCsv(this List<Network> network)
    {
       [QUERY HERE]

       network = net.toList();
    }

这有效:

public static void FillFromCsv(this List<Network> network)
    {
       [QUERY HERE]

       network.Clear();
       Foreach (Network n in net)
       {
            network.add(n);
       }
    }

1 个答案:

答案 0 :(得分:3)

您的问题与foreach vs ToList无关。问题是在第一种方法中,您没有更改传入的列表。您使用 new 参考覆盖本地引用:

public static void FillFromCsv(this List<Network> network)
{
   [QUERY HERE]

   // this only affects the _local_ "network" reference, not the reference passed in
   network = net.toList();  
}

可以将参数更改为ref参数,但为什么要使用扩展方法呢?如果您打算将其吹走,为什么呼叫者会在列表中传递?我会做的

public static IEnumerable<Network> FillFromCsv()
{
   [QUERY HERE]

   return net.ToList();  
}

在第二种方法中,您要清除传入的列表实例并将结果添加到其中。哪个好,但它与不同是你在第一种方法中所做的。

可以通过以下方式来避免foreach:

public static void FillFromCsv(this List<Network> network)
{
   [QUERY HERE]

   network.Clear();
   network.AddRange(net);

}

但是让调用者通过你的清单并清除它并重新填充它似乎很奇怪。一个更好的方法是返回一个列表(如第一个建议)。