Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Linq Query toList()为空,但foreach可以工作_C#_Linq - Fatal编程技术网

C# Linq Query toList()为空,但foreach可以工作

C# Linq Query toList()为空,但foreach可以工作,c#,linq,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(',')

我有以下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)
                           };
IEnumerable net=来自目录.GetFiles(文件夹+@“\network”)中的文件
从文件中的行。读取行(文件)。跳过(1)
设行=行。拆分(',')
选择新网络
{
networkname=getnetwork(行),
...
networkdate=getnetworkdate(行)
};
当我对它使用toList()时,列表是空的,但当我使用foreach循环时,我使用空列表并添加每个项,列表不是空的。我在这个查询中是否犯了错误,或者这种奇怪的行为是否有不同的来源

更新: 我在扩展方法中使用它,如下所示: 这不起作用:

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

       network = net.toList();
    }
public static void FillFromCsv(此列表网络)
{
[此处查询]
network=net.toList();
}
这项工作:

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

       network.Clear();
       Foreach (Network n in net)
       {
            network.add(n);
       }
    }
public static void FillFromCsv(此列表网络)
{
[此处查询]
network.Clear();
Foreach(网络中的网络n)
{
添加(n);
}
}

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

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();  
}
在第二种方法中,您将清除传入的列表实例并将结果添加到其中。这很好,但与第一种方法不同

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

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

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

}
public static void FillFromCsv(此列表网络)
{
[此处查询]
network.Clear();
AddRange(net);
}

但让打电话的人递给你一张单子,然后你把它清理出来再重新填,这似乎很奇怪。更好的方法是只返回一个列表(如第一个建议)。

您可以演示如何使用
ToList
ForEach
?您以什么顺序执行它们是否重要?这可能是由Linq延迟执行造成的,但我不确定。@“\network”的文件扩展名在哪里?您似乎正在尝试使用C#解析.CSV文件。是否要?是否尝试通过在项目上循环创建自己的列表,并将每个项目添加到列表中?var netList=新列表();foreach(网络中的var n)netList.Add(n);谢谢你的帮助,斯坦利。我之所以使用扩展,是因为我有一个额外的静态类来处理csv文件作为输入。我喜欢具有几乎相同功能的方法“粘在一起”。这并不是真正的理性原因,我只是发现当相同的功能组合在一起时,它的排列更加清晰。所以我很可能会坚持下去。另一方面,也许我应该使用你提到的更好的方法。我要喝一杯啤酒。非常感谢:-)
public static void FillFromCsv(this List<Network> network)
{
   [QUERY HERE]

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

}