首页 > 解决方案 > 从列表中提取列表> 不创建副本?

问题描述

标签: c#linqreference

解决方案


如果您可以将使用代码更改为使用 aIReadOnlyList<T>而不是 a那么编写一个将 a 转换为List<T>a 的类并不难:Tuple<T,U>IReadOnlyList<T>

public sealed class TupleExtraction<T, U> : IReadOnlyList<T>
{
    readonly List<Tuple<T, U>> _list;

    public TupleExtraction(List<Tuple<T, U>> list)
    {
        _list = list;
    }

    public T this[int index] => _list[index].Item1;

    public int Count => _list.Count;

    public IEnumerator<T> GetEnumerator()
    {
        return _list.Select(item => item.Item1).GetEnumerator();
    }

    IEnumerator IEnumerable.GetEnumerator()
    {
        return _list.Select(item => item.Item1).GetEnumerator();
    }
}

然后你可以像这样使用它:

class Program
{
    static void Main()
    {
        List<Tuple<string, int>> test = new List<Tuple<string, int>>
        {
            new Tuple<string, int>("one",   1),
            new Tuple<string, int>("two",   2),
            new Tuple<string, int>("three", 3)
        };

        var extract = new TupleExtraction<string, int>(test);

        for (int i = 0; i < extract.Count; ++i)
            Console.WriteLine(extract[i]);

        foreach (var item in extract)
            Console.WriteLine(item);
    }
}

请注意,这不会复制基础列表。


推荐阅读