我正在寻找一种方法,用一组值(在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表达式,或者将对象列表初始化为值而不是空值。
谢谢!
答案 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"}
};