【问题标题】:How to add an item to an IEnumerable如何将项目添加到 IEnumerable
【发布时间】:2014-04-25 15:14:05
【问题描述】:

在 C# 中

IEnumerable<MyModel> test = _blah.tolist();

现在我可以循环测试,但如何添加项目?

请不要告诉我添加项目没有意义,我已经看过那个帖子了。

我想知道的是,如果我循环遍历 10 个项目,我如何再穿上一个以循环遍历 11 个项目?

也没有 .Add() 方法

【问题讨论】:

  • 我不确定这是怎么复制的。这个问题是针对两个IEnumerables 的串联——甚至在标题中——这是将单个元素添加到单个我>IEnumerable。您会注意到,虽然下面的一个答案是Concat,但接受的答案不适用于连接 是转换为具有.Add 方法的东西。他们是不同的问题。 至少,如果之前有人问过如何添加,我不会感到惊讶,欺骗链接是错误的。

标签: c# collections ienumerable


【解决方案1】:

IEnumerable 是一个接口。您不能在 IEnumerable 上使用 Add(),因为它们不需要实现 Add() 方法。请参阅IEnumerable documentation on MSDN。

相反,创建一个继承自接口IList 的generic list。使用IList 接口的类型必须实现Add()。

List<MyBlahType> test = _blah.tolist();
test.Add(new MyBlahType());

如果你仍然想使用接口来避免具体类型,那么直接使用IList。

IList<MyBlahType> test= _blah.tolist();
test.Add(new MyBlahType());

顺便说一句,使用下划线开头的变量/类型名称以及不使用正确的大小写通常被认为是不好的样式。 C#中的preferred style是使用PascalCase或者camelCase进行大写。

【讨论】:

  • 成功了,谢谢!
  • 您绝对可以针对接口编写代码:stackoverflow.com/questions/4456424/…
  • “你通常不直接使用接口”——嗯,你确实这样做了。当不需要实现松散耦合时,您通常希望避免使用具体类型。
  • 如果这个问题因为您对 PascalCase 是 C# 的首选大小写约定的评论而获得大量反对票,我不会感到惊讶。虽然我同意 PascalCase 是最合乎逻辑的约定,但许多人认为 camelCase 是变量、字段和返回方法的首选。
  • @Jamiec 你误解了我的意思。您通常不会创建接口的实例。我没有说你不能从接口继承。而且我没有说你不能创建接口的实例。但普遍接受的做法是直接使用泛型列表而不是 IEnumerable。
【解决方案2】:

使用 LINQ-to-object 的 Concat 构建一个新的 IEnumerable 迭代第一个然后是第二个:

IEnumerable<MyModel> test = _blah.tolist();
IEnumerable<MyModel> second = new[] { theItem };
IEnumerable<MyModel> elevenItems = test.Concat(second);

【讨论】:

  • 谢谢,我也试试这个方法。
【解决方案3】:

如果您在IEnumerable&lt;T&gt; 上调用了ToList(),则返回类型将为List&lt;T&gt;。如果您的变量类型是List&lt;T&gt; 而不是IEnumerable&lt;T&gt;,您将能够对收到的列表执行任何操作,包括向其中添加项目,就像您可以对任何其他列表执行的操作一样。请注意,新创建的列表将与原始 IEnumerable&lt;T&gt;“分离”,因此添加、删除、重新排列或替换其中的项目不会影响另一个。然而,还要注意,可变引用类型项目的列表不保存项目,而只是标识它们。如果一个人有一个IEnumerable&lt;Car&gt; myCars,并且第三个项目是“Car#24601”,那么myCars.ToList()[2].Color = CarColors.Red; 那么原始列表中的第三个项目(即 Car #24601)将被涂成红色。

【讨论】:

    猜你喜欢
    • 2015-01-29
    • 2011-06-28
    • 2010-11-15
    • 2019-05-12
    • 2014-07-29
    • 1970-01-01
    • 2013-08-22
    • 1970-01-01
    • 2020-12-07
    相关资源
    最近更新 更多