使用非空值</t>初始化List <t>

时间:2013-06-05 15:09:28

标签: c# list

我正在寻找一种方法,用一组值(在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 个答案:

答案 0 :(得分:15)

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

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

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

答案 1 :(得分:3)

快速思考......你可以使用Enumerable.Repeat ......而不是以前的方式。这可行:

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

我不是建议你这个,但它是Enumerable.Range的一个有趣的替代品。

答案 2 :(得分: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委托中对象的索引,以便您可以根据需要对其进行说明。

答案 3 :(得分:0)

在我看来,你刚刚在新的声明之后错过了()括号。

private List<MyObject> ObjectList = new List<MyObject>()
{
        new MyObject() { property1= Value1,  property2 = "Value2"}, 
        new MyObject() { property1= Value1,  property2 = "Value2"} 
};