【问题标题】:Add one item multiple times to same List将一项多次添加到同一个列表
【发布时间】:2013-06-14 16:21:34
【问题描述】:

我想要实现的是在不使用循环的情况下多次将一项添加到列表中。

我将向列表中添加 50 个数字,并希望所有这些数字都等于 42。我知道我可以简单地创建一个运行 50 次的小循环并添加相同的项目如此反复;

List<int> listFullOfInts = new List<int>();
int addThis = 42;
for(int i = 0; i < 50; i++)
    listFullOfInts.Add(addThis);

我正在尝试做的事情是;

listFullOfInts.AddRange(addThis, 50);

或者至少与此类似的东西,也许使用 Linq?我对如何执行此操作有模糊的记忆,但找不到。有什么想法吗?

【问题讨论】:

  • 为什么不想使用列表?
  • @RuneFS 因为这就是我实现它的方式:)
  • 大声笑我的意思是“你为什么不想使用循环?”。打败了我如何最终写了其他东西(需要咖啡)
  • @RuneFS 主要是因为我知道有一种方法可以不用循环,但我找不到。

标签: c# collections


【解决方案1】:

你可以使用Repeat:

List<int> listFullOfInts = Enumerable.Repeat(42, 50).ToList();

Demo

如果您已经有一个列表并且不想使用ToList 创建一个新列表:

listFullOfInts.AddRange(Enumerable.Repeat(42, 50));

如果你想添加引用类型而不重复相同的引用,你可以使用Enumerable.Range+Select:

List<SomeClass> itemList = Enumerable.Range(0, 50)
    .Select(i => new SomeClass())
    .ToList();

【讨论】:

  • +1 还值得一提的是,引用类型将添加对同一实例的引用,因此修改任何项目都会改变其他 49
  • 这正是我想要的!谢谢! (我会尽快标记为答案)
  • 另外值得一提的是,这仍然会在某处使用循环,但不会可见。
  • @DanPuzey 有点难以解决,但它不会弄乱我的代码 :)
  • 对新对象执行此操作时要非常小心,因为它会添加相同的对象 50 次,而不是 50 个新对象。
【解决方案2】:

您不能直接使用 LINQ 来执行此操作,因为 LINQ 没有副作用,但您可以使用 System.linq 命名空间中的一些内容来构建所需的内容。

public static void AddRepeated<T>(this List<T> self,T item, int count){
  var temp = Enumerable.Repeat(item,count);
  self.AddRange(temp);
}

然后您可以按照您在帖子中的建议使用它

listFullOfInts.AddRepeated(addThis, 50);

【讨论】:

  • 示例调用不应该是listFullOfInts.AddRepeated(addThis, 50) 而不是addRange 吗?
  • 是的,应该:)
猜你喜欢
  • 2015-06-24
  • 2021-08-18
  • 1970-01-01
  • 1970-01-01
  • 2021-06-13
  • 1970-01-01
  • 1970-01-01
  • 2021-10-29
  • 2019-02-17
相关资源
最近更新 更多