Когда элементы копируются в операциях List (Concat ()) - PullRequest
0 голосов
/ 15 января 2020

У меня есть структура данных, которая содержит 3 Hashsets<T>. В некоторых моментах я хочу перебрать все наборы одновременно. Мне потребовался метод IEnumerable<T> GetCombined().

  1. Какой самый быстрый способ, если я хочу получить копии?
return set1.ToList().Concat(set2.ToList()).Concat(set3.ToList());
Какой быстрый способ, если мне не нужны копии? Concat делает копии автоматически?
return set1.Concat(set2).Concat(set3)

(быстрый в смысле производительности)

Ответы [ 3 ]

1 голос
/ 15 января 2020

Если вам просто нужна копия составного списка весь , вы можете вырезать два списка:

return set1.Concat(set2).Concat(set3).ToList();

Что такое быстрый способ, если я не не нужно иметь копии? Выполняет ли Concat автоматическое копирование?

Нет - Concat - это просто запрос , что означает, что он создаст перечислитель, который будет перечислять базовые коллекции по порядку. Копии не создаются, если вы не используете какой-либо метод, который обрабатывает запрос (например, ToList())

Также обратите внимание, что fastest может быть недостижимой целью. Могут быть микрооптимизации (закрепление памяти и т. Д. c.), Которые делают его незаметно быстрее, но за счет более сложного и сложного в обслуживании кода. Найдите что-нибудь, что достаточно быстро для ваших нужд и остановитесь на этом.

1 голос
/ 15 января 2020

Я думаю, что самый быстрый способ - остаться с HashSets и UnionWith() Они довольно быстрые, если вы хотите избежать дублирования.

Пример с HashSet<int>

HashSet<int> set1 = new HashSet<int>() { 1, 2 };
HashSet<int> set2 = new HashSet<int>() { 2, 3 };
HashSet<int> set3 = new HashSet<int>() { 3, 4 };

set1.UnionWith(set2);
set1.UnionWith(set3);

// set1 {1,2,3,4}

В случае T является ссылочным типом, вам необходимо переопределить GetHashCode() и Equals()

0 голосов
/ 15 января 2020

Вам абсолютно необходимо объединить их? Как насчет просто перечислить их все по порядку? Нечто подобное может устранить накладные расходы по объединению наборов:

void Main()
{
    var h1 = new HashSet<int>() { 1, 2, 3, 4, 5 };
    var h2 = new HashSet<int>() { 6, 7, 8, 9, 10 };
    var h3 = new HashSet<int>() { 11, 12, 13, 14, 15 };

    foreach (var i in enumerateCollections(h1, h2, h3))
    {
        Console.WriteLine(i);
    }
}

private IEnumerable<T> enumerateCollections<T>(params IEnumerable<T>[] collections)
{
    foreach (var coll in collections)
    {
        foreach (var value in coll)
        {
            yield return value;
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...