合并两个Collection <t> </t>

时间:2008-09-11 08:57:18

标签: c# collections

我得到一个返回Collection<string>的函数,并以递归方式调用自身,最终返回一个大的Collection<string>

现在,我只是想知道合并列表的最佳方法是什么? Collection.CopyTo()只复制到string [],使用foreach()循环感觉效率低下。但是,由于我还想过滤重复项,因此我觉得我最终会在Contains()上调用Collection。{/ p>

我想知道,有一种更有效的方法来使用递归函数返回没有重复的字符串列表吗?我不必使用Collection,它几​​乎可以是任何合适的数据类型。

只有排除,我绑定到Visual Studio 2005和.net 3.0,所以没有LINQ。

编辑:澄清:该功能将用户从Active Directory中取出,查看用户的直接报告,然后递归查看每个用户的直接报告。因此,最终结果是给定用户的“命令链”中的所有用户的列表。由于这是经常执行的,并且目前对于某些用户需要20秒,我正在寻找改进它的方法。将结果缓存24小时也是我的列表btw。但我想看看如何在应用缓存之前改进它。

5 个答案:

答案 0 :(得分:16)

如果您使用的是List&lt;&gt;你可以使用.AddRange将一个列表添加到另一个列表中。

或者您可以使用yield return来动态组合列表,如下所示:

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;
}

答案 1 :(得分:1)

我认为HashSet<T>是一个很好的帮助。

  

HashSet<T>课程提供   高性能设置操作。一套   是一个包含否的集合   重复元素,以及其元素   没有特别的顺序。

只需向其中添加项目,然后使用CopyTo。


更新HashSet<T>位于.Net 3.5

也许你可以使用Dictionary<TKey, TValue>。将重复键设置为字典不会引发异常。

答案 2 :(得分:1)

您可能需要查看Iesi.CollectionsExtended Generic Iesi.Collections(因为第一版是在没有仿制药的情况下在1.1中制作的。)

扩展Iesi有一个ISet类,它完全像HashSet一样:它强制执行唯一成员,不允许重复。

Iesi的优点在于它设置了运算符而不是合并集合的方法,因此您可以在union(|),intersection(&amp;),XOR(^)等之间进行选择。

答案 3 :(得分:1)

你可以通过推荐将Collection传递给你的方法,这样你就可以只添加项目,这样你就不必返回任何东西了。如果您在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表示在这里没有必要通过ref传递,如果你通过值传递它也会有效。

答案 4 :(得分:0)

就合并而言:

  

我想知道,是否更有效率   有一个递归函数的方法   返回没有的字符串列表   重复?我不必使用   收藏,它几乎可以   合适的数据类型。

你的函数组装了一个返回值,对吧?您将提供的列表分成两半,再次调用self(两次),然后合并这些结果。

在合并步骤中,为什么不在将每个字符串添加到结果之前进行检查?如果它已经存在,请跳过它。

假设您正在使用排序列表。

相关问题