C#中能否用扩展运算符语法糖,以其他集合初始化对象内的集合?
集合初始化语法糖能否直接导入已有集合的元素?
我们知道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 } // 借助语法糖直接初始化集合 }; } }
但如果要把另一个已有的列表/数组中的元素导入到新实例的集合中,有没有类似的简洁语法?不用像下面这样通过循环逐个调用Add方法:
public class D { public void Prova() { var c1 = new C() { MyList = { 1, 2, 3 } }; IList<int> list2 = [4, 5, 6]; // 传统写法,较为繁琐 var c2 = new C(); foreach (int n in list2) { c2.MyList.Add(n); } // 期望的简洁写法(无法编译) var c3 = new C() { MyList = { ..list2 } // 是否存在类似的语法? }; } }
补充说明:C类的代码(包括MyList的签名)不可修改,我清楚有很多变通方案,但仅关注是否存在能实现该目标的语法糖。
另外注意到数组的扩展运算符可以实现集合合并:
IList<int> list2 = [4, 5, 6]; IList<int> a = [..c1.MyList, ..list2];
它底层会遍历源集合创建新数组,既然编译器能在集合初始化时调用Add方法填充元素,那实现直接导入已有集合元素的语法应该不难,因此想确认是否存在这类语法。
内容的提问来源于stack exchange,提问作者Mario Vernari
相关产品推荐
相关产品推荐

