簡體   English   中英

檢查一個值集合是否包含另一個值

[英]Check if one collection of values contains another

假設我有兩個集合如下:

Collection1:“A1”“A1”“M1”“M2”

Collection2:“M2”“M3”“M1”“A1”“A1”“A2”

所有值都是字符串值。 我想知道Collection1中的所有元素是否都包含在Collection2中,但我不保證順序,並且一個集合可能有多個具有相同值的條目。 在這種情況下,Collection2包含Collection1,因為Collection2有兩個A1,M1和M2。 這是顯而易見的方式:排序集合並在找到匹配時彈出值,但我想知道是否有更快更有效的方法來執行此操作。 再次使用初始集合,我無法保證訂單或給定值出現的次數

編輯:將設置更改為集合只是為了清除這些不是集合,因為它們可以包含重復值

我所知道的最簡潔的方式:

//determine if Set2 contains all of the elements in Set1
bool containsAll = Set1.All(s => Set2.Contains(s));

是的,只要您沒有空間受限,就有更快的方法。 (見空間/時間權衡 。)

算法:

只需將Set2中的所有元素插入一個哈希表(在C#3.5中,這是一個HashSet <string> ),然后遍歷Set1的所有元素並檢查它們是否在哈希表中。 該方法更快(Θ(m + n)時間復雜度),但使用O(n)空間。

或者,只需說:

bool isSuperset = new HashSet<string>(set2).IsSupersetOf(set1);

編輯1:

對於那些擔心重復的可能性(因此用詞不當“設置”)的人來說,這個想法可以很容易地擴展:

只需創建一個新的Dictionary<string, int>表示超級列表中每個單詞的計數(每次看到現有單詞的實例時,將其添加到計數中,如果不是,則添加計數為1的單詞)在字典中),然后通過子列表並每次遞減計數。 如果字典中存在每個單詞, 並且當您嘗試遞減計數時計數從不為零,那么該子集實際上是一個子列表; 否則,你有太多的單詞實例(或根本不存在),所以它不是一個真正的子列表。


編輯2:

如果字符串非常大並且您關注空間效率,並且使用(非常)高概率的算法適合您,則嘗試存儲每個字符串的散列 從技術上講,它不能保證工作,但它不工作的可能性非常低。

我在HashSet,Intersect和其他Set理論答案中看到的問題是你確實包含重復項,“A set是一個不包含重復元素的集合”。 這是處理重復案例的一種方法。

var list1 = new List<string> { "A1", "A1", "M1", "M2" };
var list2 = new List<string> { "M2", "M3", "M1", "A1", "A1", "A2" };

// Remove returns true if it was able to remove it, and it won't be there to be matched again if there's a duplicate in list1
bool areAllPresent = list1.All(i => list2.Remove(i));

編輯 :我從Set1和Set2重命名為list1和list2以安撫Mehrdad。

編輯2 :評論意味着它,但我想明確聲明這確實改變了list2。 如果您將其用作比較或控件但之后不需要內容,則只能這樣做。

看看linq。 ..

string[] set1 = {"A1", "A1", "M1", "M2" };
string[]  set2 = { "M2", "M3", "M1", "A1", "A1", "A2" };

var matching = set1.Intersect(set2);

foreach (string x in matching)
{
    Console.WriteLine(x);
}

類似的

string[] set1 = new string[] { "a1","a2","a3","a4","a5","aa","ab" };
string[] set2 = new string[] {"m1","m2","a4","a6","a1" };

var a = set1.Select(set => set2.Contains(set));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM