在Linq vs foreach循环中调用HashSet.Add(item)

时间:2012-07-24 21:24:51

标签: c# linq

在以下代码段中需要帮助:

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

innerCustomers.Select(c => customers.Add(c));似乎无法在“customers”集合中插入记录,但是,“foreach”在该行下方工作正常。任何人都知道为什么它不能在linq中工作?我知道我没有从select方法中选择任何东西

2 个答案:

答案 0 :(得分:7)

Select它,但不对结果做任何事情。由于LINQ的惰性评估(它通过IEnumerable按需生成结果),它不会被执行。使用foreach循环,这是最干净的解决方案。

(另一个解决方案是改为使用List<Customer>并在其上调用ForEach ...但除非您有充分的理由想要使用带回调的方法,否则没有优势。)

修改:实际上,如果你所做的只是向HashSet添加元素,那么最简洁的解决方案就是UnionWith

customers.UnionWith(innerCustomers);

答案 1 :(得分:-1)

不确定您要做什么,但如果您必须使用Select,那么您可以这样做:

innerCustomers.Select(c => { customers.Add(c); return c; });