我得到一个返回Collection<string>
的函数,并以递归方式调用自身,最终返回一个大的Collection<string>
。
现在,我只是想知道合并列表的最佳方法是什么? Collection.CopyTo()
只复制到string [],使用foreach()
循环感觉效率低下。但是,由于我还想过滤重复项,因此我觉得我最终会在Contains()
上调用Collection
。{/ p>
我想知道,有一种更有效的方法来使用递归函数返回没有重复的字符串列表吗?我不必使用Collection
,它几乎可以是任何合适的数据类型。
只有排除,我绑定到Visual Studio 2005和.net 3.0,所以没有LINQ。
编辑:澄清:该功能将用户从Active Directory中取出,查看用户的直接报告,然后递归查看每个用户的直接报告。因此,最终结果是给定用户的“命令链”中的所有用户的列表。由于这是经常执行的,并且目前对于某些用户需要20秒,我正在寻找改进它的方法。将结果缓存24小时也是我的列表btw。但我想看看如何在应用缓存之前改进它。
答案 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.Collections和Extended 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(两次),然后合并这些结果。
在合并步骤中,为什么不在将每个字符串添加到结果之前进行检查?如果它已经存在,请跳过它。
假设您正在使用排序列表。