我有一个函数返回一个 Collection<string>, ,并且递归地调用自身以最终返回一个大值 Collection<string>.

现在,我只是想知道合并列表的最佳方法是什么? Collection.CopyTo() 仅复制到 string[],并使用 foreach() 循环感觉效率低下。然而,由于我也想过滤掉重复项,所以我觉得我最终会得到一个调用的 foreach Contains()Collection.

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

唯一的例外是,我绑定了 Visual Studio 2005 和 .net 3.0,所以没有 LINQ。

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

有帮助吗?

解决方案

如果您使用 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;
}

其他提示

您可能想看一下 Iesi.Collections扩展通用 Iesi.Collections (因为第一版是在 1.1 中制作的,当时还没有泛型)。

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

Iesi 的妙处在于它使用集合运算符而不是合并集合的方法,因此您可以在并集 (|)、交集 (&)、异或 (^) 等之间进行选择。

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

HashSet<T> 课程提供高性能集操作。一组是一个没有重复元素的集合,其元素没有特定顺序。

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


更新: HashSet<T> 位于 .Net 3.5 中

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

您能否通过引用将 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 传递,如果你通过值传递它也可以工作。

就合并而言:

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

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

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top