使用扩展运算符来初始化一个集合与另一个集合是否可行?

问题描述 投票:0回答:1

没什么重要的,只是为了好奇。

鉴于以下代码片段,我们知道我们可以在

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 方法会很简单,就像编译器在第一个代码片段中所做的那样。

c# collections initialization syntactic-sugar
1个回答
1
投票

据我所知,您希望使用 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);
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.