【问题标题】:How to add an item in a collection using Linq and C#如何使用 Linq 和 C# 在集合中添加项目
【发布时间】:2011-10-04 13:29:30
【问题描述】:

我有一个对象集合。例如

List<Subscription> subscription = new List<Subscription>
{
    new Subscription{ Type = "Trial", Type = "Offline", Period = 30  },
    new Subscription{ Type = "Free",  Type = "Offline", Period = 90  },
    new Subscription{ Type = "Paid",  Type = "Online",  Period = 365 }
};

现在我想使用 LINQ 在此列表中再添加一项。我该怎么做?

【问题讨论】:

  • 为什么要使用 LINQ?为什么不只是subscription.Add(new Subscription());
  • 是的,你们是对的。我们无法使用 LINQ 添加项目。现在我和格兰特和乔恩说的一样。
  • subscription.Add(new Subscription { Type = "Foo", Type2 = "Bar", Period = 1 });

标签: c# linq entity-framework generics


【解决方案1】:

你没有。 LINQ 用于查询,而不是添加。您可以通过以下方式添加新项目:

subscription.Add(new Subscription { Type = "Foo", Type2 = "Bar", Period = 1 });

(请注意,您不能在同一个对象初始化程序中两次指定属性Type。)

这根本不使用 LINQ - 它使用对象初始化器和简单的 List&lt;T&gt;.Add 方法。

【讨论】:

  • 这有一些例外。例如,出于显示的目的,需要将一个空的 ListItem 附加到集合中。在这种情况下,您可以使用联合来完成此操作,例如 StockCollection.Union(new[] { new Stock() { Name = "" } })。虽然这肯定不是一个很好的做法,但有时它很有用。
  • 我在 MVC @Html.DropDownListFor(o => o.StockID, Model.Stock.Union(new[] { new Stock() { Name = "" } } ).Select(o => new SelectListItem() { Text = o.Name, Value = o.StockID.ToString() })
  • @MaximGershkovich:这不是将列表项附加到集合中。它正在从两个序列中创建一个新序列。 (我个人会使用 Concat 而不是 Union,但这是另一回事。)“将项目添加到集合”必然会更改集合的内容 - 你没有这样做。
  • 很公平,但我觉得这是在争论语义而不是 OP 的实际意图。
  • @Maxim:OP 的意图似乎是添加到集合中,因为这是所要求的。工会根本不这样做。
【解决方案2】:

我建议使用List.Add():

subscription.Add(new Subscriptioin(...))

LINQ Union()List&lt;&gt; 实例包装单个项目过度杀伤:

subscriptions.Union(new List<Subscription> { new Subscriptioin(...) };

【讨论】:

  • 要详细说明第二种方法,它是将列表的修改版本视为新实例的函数方法。这允许列表不变性并且在函数式编程模型中具有一定的内在优势。虽然取决于场景,但它可能不会表现得那么好。如需进一步参考:en.wikipedia.org/wiki/Immutable_object
猜你喜欢
  • 2017-12-06
  • 1970-01-01
  • 2013-09-24
  • 1970-01-01
  • 1970-01-01
  • 2014-03-08
  • 2011-02-11
  • 1970-01-01
  • 2022-11-26
相关资源
最近更新 更多