合并两个 Collection<T>

9
我有一个返回 Collection<string> 的函数,该函数递归调用自身以最终返回一个大的 Collection<string>
现在,我想知道合并列表的最佳方法是什么?Collection.CopyTo() 只能复制到 string[],使用 foreach() 循环感觉效率低下。但是,由于我还想过滤重复项,因此我觉得最终会得到一个调用 Collection 上的 Contains() 的 foreach。
我想知道,是否有一种更有效的方式来递归函数,返回一个没有重复项的字符串列表?我不必使用 Collection,它可以是任何合适的数据类型。
唯一的例外是,我受限于 Visual Studio 2005 和 .net 3.0,因此不能使用 LINQ。
编辑:为了澄清:该函数从 Active Directory 中获取用户,查看用户的直接报告,然后递归查看每个用户的直接报告。因此,最终结果是给定用户“命令链”中的所有用户列表。由于这经常执行,并且目前对于某些用户需要 20 秒,因此我正在寻找改进它的方法。将结果缓存 24 小时也在我的列表中,但是我想在应用缓存之前看看如何改进它。
5个回答

18

如果您正在使用List<>,则可以使用.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
你能通过引用将集合传递到方法中,以便你可以直接向其中添加项目,这样你就不必返回任何东西。如果你使用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所说,这里不需要通过引用传递,如果你通过值传递也可以工作。


我认为需要注意的是Contains()函数,因为它需要每次遍历整个列表来检查重复项。但通过传递引用可能可以减少开销。 - Michael Stum
在这里传递作为引用并没有什么区别,除非你给myitems分配一个新的对象。简单地按值传递就可以了(该值是对对象的引用,ref是对包含对对象引用的变量的引用)。 - Zooba

1

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

HashSet<T> 类提供了高性能的集合操作。集合是一种不包含重复元素且元素无特定顺序的集合。

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


更新: HashSet<T> 在 .Net 3.5 中已经存在。

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


1

你可能需要查看Iesi.Collections扩展泛型Iesi.Collections(因为第一版是在还没有泛型的1.1版本中制作的)。

扩展的Iesi有一个ISet类,它的行为与HashSet完全相同:强制唯一成员,不允许重复。

Iesi的好处在于它具有集合操作符而不是合并集合的方法,因此您可以在联合(|)、交集(&)、异或(^)等之间进行选择。


0

关于合并:

我想知道,是否有更有效的递归函数可以返回一个没有重复字符串的列表?我不必使用集合,它可以是任何适当的数据类型。

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

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

当然,假设你正在使用排序列表。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接