質問
を返す関数を取得しました Collection<string>
, 、それ自体が再帰的に呼び出され、最終的に 1 つの大きな値が返されます。 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.コレクション そして 拡張された汎用 Iesi.Collections (初版はジェネリックがまだ存在しなかった 1.1 で作成されたため)。
拡張 Iesi には、HashSet として機能する ISet クラスがあります。これにより、一意のメンバーが強制され、重複は許可されません。
Iesi の優れた点は、コレクションをマージするメソッドの代わりに集合演算子を備えているため、結合 (|)、交差 (&)、XOR (^) などから選択できることです。
私は思う 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 を再度 (2 回) 呼び出して、それらの結果をマージします。
マージステップ中に、各文字列を結果に追加する前にチェックしてみてはいかがでしょうか?すでに存在する場合はスキップしてください。
もちろん、ソートされたリストを操作していることを前提としています。