2010-09-08 47 views
4

這裏同樣子集合選擇項是僞案:使用LINQ

class parent{ 
    string name; //Some Property 
    List<int> myValues; 

    ....... 
} 
........ 
//Initialize some parent classes 

List<parent> parentList = new List<parent>(); 
parentList.add(parent123); //parent123.myValues == {1,2,3} 
parentList.add(parent456); //parent456.myValues == {4,5,6} 
parentList.add(parentMatch); //parentMatch.myValues == {1,2,3} 

我所瞄準是檢索出其 myValues列表是等價的父對象列表的查詢。在這種情況下,它會返回parent123和parentMatch。

+0

@forcripesake:你能澄清一下 '其中myValues列表包含相同的整數' 的意思? – Ani 2010-09-08 19:07:58

+0

這是否意味着您想要查找所有'myValues'匹配的父'?即列表是一樣的嗎? – 2010-09-08 19:15:18

+0

@forcripesake:順便說一句,如果你想讓查詢在'List '上工作而不需要反思,你將不得不通過公共屬性公開這些字段(或者使這些字段本身公開,但這是一個壞主意) 。 – Ani 2010-09-08 19:18:01

回答

3

所以你可以用邏輯和公正使用GroupBy如果您執行IEqualityComparer

class IntegerListComparer : IEqualityComparer<List<int>> 
{ 
    #region IEqualityComparer<List<int>> Members 

    public bool Equals(List<int> x, List<int> y) 
    { 
     //bool xContainsY = y.All(i => x.Contains(i)); 
     //bool yContainsX = x.All(i => y.Contains(i)); 
     //return xContainsY && yContainsX; 
     return x.SequenceEqual(y); 
    } 

    public int GetHashCode(List<int> obj) 
    { 
     return 0; 
    } 

    #endregion 
} 

調用它像這樣:

var results = list 
    .GroupBy(p => p.MyValues, new IntegerListComparer()) 
    .Where(g => g.Count() > 1) 
    .SelectMany(g => g); 
+0

+1我只是寫在我的答案...這可能是最好的/正確的解決方案。 ;) – digEmAll 2010-09-08 20:22:37

+0

我要試試這個,我如何返回一個列表而不是anon類型? – ForCripeSake 2010-09-08 20:28:15

+0

@Zachary:也許你可以通過在GetHashCode中返回obj.Count來獲得速度,或者例如返回前2-3個元素的總和。而且,你錯過了從句中篩選單親父母的地方。 – digEmAll 2010-09-08 20:29:22

1

非常傻溶液:

var groups = list.GroupBy(p => string.Join(",", p.list.Select(i => i.ToString()).ToArray())) 
        .Where(x => x.Count() > 1).ToList(); 

結果:

含有具有相同INT列表父對象組的IEnumerable(以相同的順序)。

如果您需要以任何順序匹配元素列表(即1,2,3 == 3,1,2),只需將p.list更改爲p.list.OrderBy(x => x)即可。

另外,如果你的目標框架4.0,你能避免ToArrayToString


編輯:

添加到過濾單組發生一個地方。

現在,如果你有這些家長:

parent A 1,2,3 
parent B 1,2,3 
parent C 1,2,3 
parent D 4,5,6 
parent E 4,5,6 
parent F 7,8,9 

返回:

(A,B,C) - (D,E) 
+0

我喜歡簡單 – 2010-09-08 19:33:17

+0

這將返回整齊的整數數組,但仍然有一些工作要找到其列表與此平展值相匹配的第一個對象。也只返回1個條目,而不是多個。 – 2010-09-08 19:37:51

+0

它工作正常,我測試過它。它返回具有相同元素的父母組。 – digEmAll 2010-09-08 19:49:04

0

試試這個:

var matches = (from p1 in parentList 
       from p2 in parentList 
       let c1 = p1.myValues 
       let c2 = p2.myValues 
       where p1 != p2 && 
        c1.All(child => c2.Contains(child)) && 
        c2.All(child => c1.Contains(child)) 
       select p1).Distinct(); 
+0

忘記提及......這忽略了重複性和順序。 – 2010-09-08 20:07:10