9

を返す関数を取得し、Collection<string>それ自体を再帰的に呼び出して、最終的に大きな 1 つを返しますCollection<string>

さて、リストをマージするための最良のアプローチは何だろうか? Collection.CopyTo()string[] にコピーするだけで、foreach()ループを使用すると効率が悪いように感じます。ただし、重複も除外したいので、. を呼び出す foreach になってしまう気がしContains()ますCollection

重複のない文字列のリストを返す再帰関数を使用するより効率的な方法はありますか? を使用する必要はありませんCollection。ほぼすべての適切なデータ型にすることができます。

除外のみ、私は Visual Studio 2005 と .net 3.0 にバインドされているため、LINQ はありません。

編集:明確にするために:関数はユーザーをActive Directoryから取り出し、ユーザーの直属の部下を調べてから、すべてのユーザーの直属の部下を再帰的に調べます。したがって、最終結果は、特定のユーザーの「コマンドチェーン」にあるすべてのユーザーのリストです。これは頻繁に実行され、現時点では一部のユーザーで20秒かかるため、改善する方法を探しています. 24時間の結果をキャッシュすることも私のリストにありますが、キャッシュを適用する前にそれを改善する方法を知りたいです。

4

5 に答える 5

17

List<> を使用している場合は、.AddRange を使用して 1 つのリストを別のリストに追加できます。

または、 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;
}
于 2008-09-11T09:06:44.990 に答える
1

大変助かると思いHashSet<T>ます。

このHashSet<T>クラスは、高パフォーマンスのセット操作を提供します。セットは、重複する要素を含まず、要素が特定の順序になっていないコレクションです。

それに項目を追加してから、CopyTo を使用します。


更新HashSet<T>.Net 3.5にあります

多分あなたは使うことができますDictionary<TKey, TValue>。ディクショナリに重複キーを設定しても、例外は発生しません。

于 2008-09-11T09:03:29.943 に答える
1

Iesi.CollectionsExtended Generic Iesi.Collectionsを参照することをお勧めします(ジェネリックがまだなかったときに最初の版が 1.1 で作成されたため)。

Extended Iesi には、HashSet として機能する ISet クラスがあります。これは、一意のメンバーを強制し、重複を許可しません。

Iesi の優れた点は、コレクションをマージするためのメソッドの代わりに演算子を設定していることです。したがって、結合 (|)、交差 (&)、XOR (^) などから選択できます。

于 2008-09-11T09:13:14.367 に答える
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 による受け渡しは必要ありません。値渡しの場合も機能します。

于 2008-09-11T09:16:40.490 に答える
0

マージに関する限り:

重複のない文字列のリストを返す再帰関数を使用するより効率的な方法はありますか? Collection を使用する必要はありません。ほぼすべての適切なデータ型にすることができます。

あなたの関数は戻り値を組み立てますよね?提供されたリストを半分に分割し、 self を再度 (2 回) 呼び出してから、それらの結果をマージしています。

マージのステップで、各文字列を結果に追加する前に確認しないのはなぜですか? 既にある場合は、スキップしてください。

もちろん、ソートされたリストを扱っていると仮定します。

于 2008-09-11T11:49:33.540 に答える