2008-09-11 112 views
8

我得到一個函數返回Collection<string>,並且遞歸調用它自己以最終返回一個大的Collection<string>合併兩個集合<T>

現在,我只是想知道什麼是合併列表的最佳方法? Collection.CopyTo()只複製到字符串[],並且使用foreach()循環感覺效率低下。但是,因爲我也想過濾掉重複的內容,所以我覺得我最終會在Collection上以Contains()作爲結果。

我想知道,是否有一個更有效的方法來有一個遞歸函數返回一個沒有重複的字符串列表?我不必使用Collection,它幾乎可以是任何適合的數據類型。

只有排除,我綁定到Visual Studio 2005和.net 3.0,所以沒有LINQ。

編輯:澄清:函數將用戶帶出Active Directory,查看用戶的直接報告,然後遞歸查看每個用戶的直接報告。所以最終的結果是一個給定用戶的「命令鏈」中的所有用戶的列表。由於這是經常執行的,並且目前對於某些用戶需要20秒,所以我正在尋找改進它的方法。 24小時緩存結果也列在我的列表中,但我想在應用緩存之前查看如何改進它。

回答

16

如果您使用列表<>,則可以使用.AddRange將一個列表添加到另一個列表。

或者你可以使用收益返回列表上飛這樣的組合:

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

我認爲HashSet<T>是一個很大的幫助。

HashSet<T>類提供 高性能集操作。一組 是一個集合,其中不包含 重複的元素,其元素 沒有特定的順序。

只需將項目添加到它,然後使用CopyTo。


更新HashSet<T>是在.net 3.5

也許你可以使用Dictionary<TKey, TValue>。將重複鍵設置爲字典不會引發異常。

1

你可能想看看Iesi.CollectionsExtended Generic Iesi.Collections(因爲第一版是在1.1做的時候有沒有泛型)。

擴展Iesi有一個ISet類,其行爲與HashSet完全相同:它強制使用唯一成員,並且不允許重複。關於Iesi的巧妙之處在於它已經設置了操作符而不是合併集合的方法,因此您可以在聯合(|),交集(&),XOR(^)等之間進行選擇。

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傳遞由裁判在這裏沒有必要,如果你路過的價值也將正常工作。

+0

我認爲警告是Contains()函數,我需要檢查重複項,因爲每次都必須遍歷整個列表。但作爲裁判傳球可以減少開銷。 – 2008-09-11 09:29:28

0

至於合併雲:

我不知道,是那裏有一個遞歸函數, 返回一個字符串列表沒有 重複更有效的方式 ?我不必使用 集合,它可以是幾乎任何合適的數據類型。

你的函數組裝一個返回值,對嗎?你將提供的列表分成兩半,再次調用自己(兩次),然後合併這些結果。

在合併步驟中,爲什麼不在檢查結果前添加每個字符串?如果它已經在那裏,請跳過它。

假設你正在使用排序列表當然。