是否有更简洁的方法使用LINQ将项添加到集合属性?

时间:2012-01-17 12:50:33

标签: c# linq

是否有一行LINQ语句将替换下面代码中的foreach循环?

public static ReplaceItemsOnOrder(Order order, List<OrderItem> replacements)
{
    order.Items.Clear();
    foreach (var item in replacements)
    {
        order.Items.Add(item);
    }
}

编辑:

以下是Order类的简化定义:

public class Order
{
    private Collection<OrderItem> _items = new Collection<OrderItem>();
    public Collection<OrderItem> Items
    {
        get { return _items; }
    }
}

4 个答案:

答案 0 :(得分:3)

这不是LINQ,而是AddRange

order.Items.AddRange(replacements);

但你还没有说Items是什么,所以除非它是List,否则该方法将无法使用。

答案 1 :(得分:3)

您可以写下以下内容:

order.Items.Clear();
replacements.ForEach(order.Items.Add);

或者,如果有一个addRange方法(List<T>上可用):

order.Items.Clear();
order.Items.AddRange(replacements);

答案 2 :(得分:2)

order.Items是一个列表吗?你可以:

public static ReplaceItemsOnOrder(Order order, List<OrderItem> replacements)
{
    order.Items = new List<OrderItem>(replacements);
}

这是有道理的,因为在您的示例代码中,您似乎替换 order.Items中的项目。 List<T>a constructor,它接受​​IEnumerable<T>参数,其内容将被复制到正在构建的列表中。

在某种意义上说,如果在构造时发生错误(包括复制操作),它也会更安全,它不会产生半满的新列表。

答案 3 :(得分:2)

不,Linq是关于选择而不是修改。

您可以编写自己的扩展方法来添加此功能。