没什么重要的,只是为了好奇。
鉴于以下代码片段,我们知道我们可以在
MyList
实例构造期间初始化 C
列表,这要归功于特殊的语法糖:
public class C {
private List<int> _myList = new();
public IList<int> MyList => this._myList;
}
public class D {
public void Prova() {
var c1 = new C() {
MyList = { 1, 2, 3 } //here
};
}
}
但是,如果我们需要从另一个列表/数组中提取数字,我想知道是否有类似的“简洁”方式,而不是在实例创建后添加每个数字。
即:
public class D {
public void Prova() {
var c1 = new C() {
MyList = { 1, 2, 3 }
};
IList<int> list2 = [4, 5, 6];
//classic approach, more verbose
var c2 = new C();
foreach (int n in list2) {
c2.MyList.Add(n);
}
//just a suggestion (does not compile)
var c3 = new C() {
MyList = { ..list2 } //clues?
};
}
}
有什么线索吗?值得吗?
更新:我的错。我没有指定
C
类(因此是 MyList
签名)无法更改。
我知道有很多解决方案作为解决方法,但我的问题严格是针对可能的语法糖来实现目标。
更新2:我刚刚注意到数组的扩展运算符的工作原理与填充列表基本相同:
IList<int> list2 = [4, 5, 6];
IList<int> a = [..c1.MyList, ..list2];
在幕后,实际的代码相当复杂。但是,很明显,通过迭代两个源创建了一个新数组。
此时,调用 Add 方法会很简单,就像编译器在第一个代码片段中所做的那样。
据我所知,您希望使用 MyList = { ..list2 } 的简洁语法在 C# 中不存在 集合初始值设定项语法仅支持添加单个元素
但是,您可以实现一种更简洁的方法,将另一个集合中的所有元素添加到 MyList,而无需使用 foreach 循环手动迭代它们
只需修改 C 类以包含添加整个范围的方法
public class C
{
private List<int> _myList = new();
public IList<int> MyList => _myList;
// Add this method to allow adding a range of elements
public void AddRange(IEnumerable<int> range)
{
_myList.AddRange(range);
}
}
我们可以使用 D 中的范围
public class D
{
public void Prova()
{
var c1 = new C()
{
// Initialize with individual elements
MyList = { 1, 2, 3 }
};
IList<int> list2 = new List<int> { 4, 5, 6 };
// Use AddRange to add elements from another collection
var c2 = new C();
c2.AddRange(list2);
}
}