合并两个Collection
我得到一个返回Collection
的函数,它以递归方式调用自身,最终返回一个大的Collection
。
现在,我只是想知道合并列表的最佳方法是什么? Collection.CopyTo()
只复制到string [],并且使用foreach()
循环感觉效率低下。 但是,因为我也想过滤掉重复项,所以我觉得我最终会得到一个在Collection
上调用Contains()
的foreach。
我想知道,有一种更有效的方法来获得一个递归函数,它返回一个没有重复的字符串列表吗? 我不必使用Collection
,它可以是几乎任何合适的数据类型。
只有排除,我绑定到Visual Studio 2005和.net 3.0,所以没有LINQ。
编辑:澄清:该function将用户从Active Directory中取出,查看用户的直接报告,然后递归查看每个用户的直接报告。 因此,最终结果是给定用户的“命令链”中的所有用户的列表。由于这是经常执行的,并且目前对于某些用户需要20秒,我正在寻找改进它的方法。 将结果缓存24小时也是我的列表btw。但我想看看如何在应用缓存之前改进它。
如果您使用List <>,则可以使用.AddRange将一个列表添加到另一个列表中。
或者您可以使用yield return来动态组合列表,如下所示:
public IEnumerable Combine(IEnumerable col1, IEnumerable col2) { foreach(string item in col1) yield return item; foreach(string item in col2) yield return item; }
您可能想看看Iesi.Collections和Extended Generic Iesi.Collections (因为第一版是在没有generics的情况下在1.1中制作的)。
扩展的Iesi有一个ISet类,它完全像HashSet一样:它强制执行唯一的成员,不允许重复。
Iesi的优点在于它设置了运算符而不是合并集合的方法,因此您可以在union(|),intersection(&),XOR(^)等之间进行选择。
我认为HashSet
是一个很好的帮助。
HashSet
类提供高性能集合操作。 集合是一个不包含重复元素的集合,其元素没有特定的顺序。
只需添加项目,然后使用CopyTo。
更新 : HashSet
位于.Net 3.5中
也许你可以使用Dictionary
。 将重复键设置为字典不会引发exception。
你可以通过引用将Collection传递给你的方法,这样你就可以添加项目,这样你就不必返回任何东西了。 如果你在c#中做到这一点,这就是它的样子。
class Program { static void Main(string[] args) { Collection myitems = new Collection (); myMthod(ref myitems); Console.WriteLine(myitems.Count.ToString()); Console.ReadLine(); } static void myMthod(ref Collection myitems) { myitems.Add("string"); if(myitems.Count <5) myMthod(ref myitems); } }
由@Zooba表示在这里没有必要通过ref,如果你通过值传递它也将工作。
至于合并:
我想知道,有一种更有效的方法来获得一个递归函数,它返回一个没有重复的字符串列表吗? 我不必使用Collection,它可以是几乎任何合适的数据类型。
你的函数组装了一个返回值,对吧? 您将提供的列表分成两半,再次调用self(两次),然后合并这些结果。
在合并步骤中,为什么不在将每个字符串添加到结果之前进行检查? 如果它已经存在,请跳过它。
假设您正在使用排序列表。