Вопрос

У меня есть функция, которая возвращает Collection<string>, и он вызывает себя рекурсивно, чтобы в конечном итоге вернуть один большой Collection<string>.

Теперь мне просто интересно, какой лучший подход к объединению списков? Collection.CopyTo() копируется только в строку[] и используя foreach() цикл кажется неэффективным.Однако, поскольку я также хочу отфильтровать дубликаты, я чувствую, что в конечном итоге у меня получится foreach, который вызывает Contains() на Collection.

Интересно, есть ли более эффективный способ создать рекурсивную функцию, возвращающую список строк без дубликатов?мне не обязательно использовать Collection, это может быть практически любой подходящий тип данных.

Единственное исключение: я привязан к Visual Studio 2005 и .net 3.0, поэтому без LINQ.

Редактировать: Чтобы уточнить:Функция извлекает пользователя из Active Directory, просматривает прямые подчиненные пользователя, а затем рекурсивно просматривает прямые подчиненные каждого пользователя.Таким образом, конечным результатом является список всех пользователей, которые находятся в «цепочке команд» данного пользователя. Поскольку это выполняется довольно часто и на данный момент для некоторых пользователей занимает 20 секунд, я ищу способы улучшить его.Кстати, кэширование результата на 24 часа тоже в моем списке, но я хочу посмотреть, как его улучшить, прежде чем применять кеширование.

Это было полезно?

Решение

Если вы используете List<>, вы можете использовать .AddRange, чтобы добавить один список в другой список.

Или вы можете использовать возврат доходности для объединения списков на лету следующим образом:

public IEnumerable<string> Combine(IEnumerable<string> col1, IEnumerable<string> col2)
{
    foreach(string item in col1)
        yield return item;

    foreach(string item in col2)
        yield return item;
}

Другие советы

Возможно, вы захотите взглянуть на Iesi.Коллекции и Расширенные общие коллекции Iesi.Collections (потому что первая редакция была сделана в версии 1.1, когда еще не было дженериков).

В расширенном Iesi есть класс ISet, который действует точно так же, как HashSet:он обеспечивает уникальные члены и не допускает дубликатов.

Отличительной особенностью Iesi является то, что в нем вместо методов объединения коллекций используются операторы установки, поэтому у вас есть выбор между объединением (|), пересечением (&), XOR (^) и т. д.

Я думаю HashSet<T> это отличная помощь.

А HashSet<T> Класс обеспечивает высокопроизводительные операции.Набор - это коллекция, которая не содержит дублирующих элементов, и чьи элементы не находятся в определенном порядке.

Просто добавьте в него элементы, а затем используйте CopyTo.


Обновлять: HashSet<T> находится в .Net 3.5

Может быть, вы можете использовать Dictionary<TKey, TValue>.Установка дубликата ключа в словаре не вызовет исключения.

Можете ли вы передать коллекцию в свой метод по ссылке, чтобы вы могли просто добавлять в нее элементы, и вам не нужно ничего возвращать.Вот как это могло бы выглядеть, если бы вы сделали это на C#.

class Program
{
    static void Main(string[] args)
    {
        Collection<string> myitems = new Collection<string>();
        myMthod(ref myitems);
        Console.WriteLine(myitems.Count.ToString());
        Console.ReadLine();
    }

    static void myMthod(ref Collection<string> myitems)
    {
        myitems.Add("string");
        if(myitems.Count <5)
            myMthod(ref myitems);
    }
}

Как заявил @Zooba, передача по ссылке здесь не обязательна, если вы передаете по значению, это также будет работать.

Что касается слияния:

Интересно, есть ли более эффективный способ иметь рекурсивную функцию, которая возвращает список строк без дубликатов?Мне не нужно использовать коллекцию, это может быть практически любым подходящим типом данных.

Ваша функция собирает возвращаемое значение, верно?Вы делите предоставленный список пополам, снова вызываете self (дважды), а затем объединяете эти результаты.

Почему бы на этапе слияния просто не проверять перед добавлением каждой строки к результату?Если он уже есть, пропустите его.

Предполагая, что вы, конечно, работаете с отсортированными списками.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top