C# Linq Query toList()为空,但foreach可以工作
我有以下Linq查询: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(',')
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
vsToList
无关。问题是在第一种方法中,您没有更改传入的列表。您正在用新引用覆盖本地引用:
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);
}