【问题标题】:Linq Query toList() is empty but foreach worksLinq Query toList() 为空,但 foreach 有效
【发布时间】:2016-04-27 23:25:41
【问题描述】:

我有以下 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 循环时,我使用一个空列表并添加每个项目,它不是。我是否在此查询中犯了错误,或者这种奇怪行为可能有不同的来源?

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

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);
       }
    }

【问题讨论】:

  • 你能说明你如何使用ToListForEach吗?你按什么顺序做这些有关系吗?
  • 这可能是由 Linq 延迟执行引起的,但我不确定。
  • @"\network" 的文件扩展名在哪里?
  • 您似乎正在尝试使用 C# 解析 .CSV 文件。你想use a library吗?
  • 您是否尝试通过遍历将每个项目添加到列表中的项目来创建自己的列表? var netList = new List(); foreach(var n in net) netList.Add(n);

标签: c# linq


【解决方案1】:

您的问题与foreachToList 无关。问题在于,在第一种方法中,您没有更改传入的列表。您正在用 new 引用覆盖 local 引用:

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

}

但是让调用者给你一个列表然后你清除它并重新填充它似乎很奇怪。更好的方法是返回一个列表(就像第一个建议一样)。

【讨论】:

  • 感谢您的帮助 D Stanley。我正在使用扩展,因为我有一个额外的静态类来处理 csv 文件作为输入。当具有几乎相同功能的方法“粘在一起”时,我喜欢它。这不是真正的理性原因,我只是发现将相同的功能组合在一起时排列更清晰。所以我可能会坚持下去。另一方面,也许我应该使用您提到的更好的方法。我会为此喝一杯啤酒。非常感谢:-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-08-15
  • 2017-09-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多