我有以下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);
}
}
答案 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);
}
但是让调用者通过你的清单并清除它并重新填充它似乎很奇怪。一个更好的方法是返回一个列表(如第一个建议)。