C# 在Linq vs foreach循环中调用HashSet.Add(项)
需要以下代码段的帮助:C# 在Linq vs foreach循环中调用HashSet.Add(项),c#,linq,C#,Linq,需要以下代码段的帮助: static void Main(string[] args) { var customers = new HashSet<Customer>(); var action = new Action(() => { var innerCustomers = new Customer[] { new Customer { CustomerID = 1, CustomerNam
static void Main(string[] args)
{
var customers = new HashSet<Customer>();
var action = new Action(() =>
{
var innerCustomers = new Customer[]
{
new Customer { CustomerID = 1, CustomerName = "C 1" },
new Customer { CustomerID = 2, CustomerName = "C 2" },
};
innerCustomers.Select(c => customers.Add(c)); //doesn't work
foreach (var customer in innerCustomers)
customers.Add(customer); //works fine
});
action();
}
static void Main(字符串[]args)
{
var customers=newhashset();
变量操作=新操作(()=>
{
var innerCustomers=新客户[]
{
新客户{CustomerID=1,CustomerName=“C 1”},
新客户{CustomerID=2,CustomerName=“C2”},
};
innerCustomers.Select(c=>customers.Add(c));//不起作用
foreach(innerCustomers中的var客户)
customers.Add(customer);//工作正常
});
动作();
}
innercusters.Select(c=>customers.Add(c))
在“customers”集合中插入记录方面似乎不起作用,但是在该行下面的“foreach”可以正常工作。有人知道为什么它在林克不起作用吗?我知道我没有从select方法中选择任何东西,但是不要对结果做任何事情。由于LINQ的延迟计算(它通过一个IEnumerable
)按需生成结果),它无法执行。使用foreach
循环,这是最干净的解决方案
(另一种解决方案是使用列表
,并在此基础上调用ForEach
。。但是,除非您有很好的理由希望使用带有回调的方法,否则没有任何优势。)
编辑:实际上,如果您所做的只是向哈希集添加元素,那么最干净的解决方案是:
不确定要执行的操作,但如果必须使用Select,则可以执行以下操作:
innerCustomers.Select(c => { customers.Add(c); return c; });
谢谢,我完全忘记了延迟加载:);我一调用.ToList(),它就开始加载集合。@MoizDhanji:一般来说,LINQ应该没有副作用。在调用ToList
@minitech时,通常会出现一个列表:“UnionWith”是我刚才使用的。我在浏览器上看到你提出了同样的建议:)@Austin:“ToList”只是暂时用来看看它是否有效。感谢您提供的信息。正如minitech提到的,由于延迟加载,它不会工作。Linq不是一个修改工具,而是一个查询工具。
innerCustomers.Select(c => { customers.Add(c); return c; });