Извлечь список <A>из списка> без создания копии? - PullRequest
0 голосов
/ 05 июня 2018

Короткая версия: я знаю, что C # в основном работает, используя ссылки, но мне было интересно, если это так и есть, если вы пытаетесь извлечь List<A> из List<Tuple<A,B>>, оставив исходный список нетронутым.

Длинная версия: я сейчас работаю с большим количеством данных, а это значит, что мне нужно быть особенно осторожным, чтобы случайно не создать бумажную копию моих данных.Я написал метод, который возвращает List<Tuple<A, List<B>>.Предполагается, что каждый B ссылается на один A (а не тот, к которому он уже подключен через кортеж).Я могу найти нужный объект в List<A>, используя информацию, уже содержащуюся в каждом B, однако, очевидно, я не могу дублировать Данные в A, иначе моя RAM может взорваться.Если я выполню команду на IEnumerable, которая возвращается при использовании ListOfTuples.Select(x=>x.Item1);, будет ли она работать на List<A> в моем List<Tuple...> или на бумажном носителе?

Ответы [ 2 ]

0 голосов
/ 05 июня 2018

Если вы можете изменить свой потребительский код, чтобы использовать IReadOnlyList<T> вместо List<T>, тогда не составит труда написать класс, который преобразует 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);
    }
}

Обратите внимание, что это не делает копию базового списка.

0 голосов
/ 05 июня 2018
List<A> result = ListOfTuples.Select(x=>x.Item1).ToList()

Когда A является ссылочным типом, он создает второй список A, не копируя элементы A.Когда A является типом значения, он создает второй список, содержащий копию элементов A

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...