7

我正在寻找一种方法来使用一组值(在 C# 中)初始化 List 类型的变量。是的,有对象初始化,但这需要为您想要的每个值创建一个新对象,我宁愿避免它。

这是一个示例:

class MyObject
{
  public string Name {get;set;}
}
List<MyObject> OldNames = new List<MyObject>(10);
List<MyObject> NewNames = new List<MyObject>(5);

这很好,但 OldNames 包含对 MyObject 类型对象的 10 个空引用。

使用列表初始化程序我可以这样做:

List<MyObject> OldNames = new List<MyObject>{
  new MyObject(),
  new MyObject(),
  new MyObject(),
  etc.

这有点痛苦,因为我有许多列表变量和各种大小要初始化(例如,一个变量是 26 个对象的列表。是的,我可以编写一个函数或扩展来为我做这个初始化(在一个循环中,我提供大小)但同样是我不一定要编写的代码。

我希望有某种 lamdba 或 LINQ 表达式或将对象列表初始化为值而不是空值的东西。

谢谢!

4

4 回答 4

17

使用Enumerable.RangeLINQ 方法指定迭代次数。

List<MyObject> NewNames = Enumerable.Range(1,5).Select(i => new MyObject()).ToList();

这里的数字1是任意的,因为索引器不以任何方式使用。

于 2013-06-05T15:10:50.167 回答
3

只是一个快速的沉思......你可以使用Enumerable.Repeat......只是不是以前的方式。这会起作用:

var query = Enumerable.Repeat<Func<MyObject>>(() => new MyObject(), count)
                      .Select(x => x())
                      .ToList();

我不是建议你应该这样做,但它是Enumerable.Range.

于 2013-06-05T15:48:56.580 回答
1

为自己创建一个创建和初始化函数。

public List<T> CreateAndInitialize<T>(int size, Func<int, T> init)
{
  var result = new List<T>(size);
  for (int i = 0; i < size; ++i)
    result.Add(init(i));
  return result;
}

然后

List<MyObject> newNames = CreateAndInitialize(15, i => return new MyObject());

我选择在 init 委托中传递对象的索引,以便您可以在需要时进行说明。

于 2013-06-05T15:16:20.390 回答
0

在我看来,您只是缺少新声明后的 () 括号。

private List<MyObject> ObjectList = new List<MyObject>()
{
        new MyObject() { property1= Value1,  property2 = "Value2"}, 
        new MyObject() { property1= Value1,  property2 = "Value2"} 
};
于 2014-10-23T21:16:08.023 回答