将一个项目添加多次到同一列表中

35

我想要实现的是向一个List中添加一个元素,但不使用循环多次添加。

我要向一个List中添加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?我有一个模糊的记忆,看到过如何做到这一点,但现在找不到了。有什么想法吗?


为什么你不想使用列表? - Rune FS
@RuneFS,因为这是我实现的方式 :) - Sander
我是说“为什么你不想使用循环?”。我不知道我怎么会写出其他的东西(需要咖啡)。 - Rune FS
主要是因为我知道有一种方法可以不用循环来实现,但我找不到它。 - Sander
2个回答

65

您可以使用Repeat

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

演示

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

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

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

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

4
值得一提的是,在引用类型中,引用同一个实例,因此修改其中任何一项都会改变其他49项。+1 - Sergey Berezovskiy
这正是我正在寻找的!谢谢!(一旦允许,我会将其标记为答案) - Sander
还值得一提的是,这仍然会使用循环,但它不会可见。 - Dan Puzey
3
有点难以理解,但不会使我的代码混乱 :) - Sander
使用新对象进行操作时一定要非常小心,因为它将增加相同的对象50次,而不是50个新对象。 - Dave
@Dave:是的,使用引用类型时,你可以添加相同的引用;而对于值类型(如int或结构体),这不是问题。但是,我展示了如何通过使用Select(最后的代码片段)来避免这个问题。 - undefined

5

由于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);

1
示例调用不应该是 addRange,而应该是 listFullOfInts.AddRepeated(addThis, 50),对吗? - mz8i
是的,它应该 :) - Rune FS

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接