2014-10-26 136 views
0

我有一個像下面的表2個或以上的團體:笛卡爾乘積爲小組成員

Id Value GroupId 
1 A  1 
2 B  1 
3 C  2 
4 D  2 

現在我想告訴總的關係(總:2 * 2 = 4,因爲我們有2組,每組一個有2名成員)象下面這樣:

A & C 
A & D 
B & C 
B & D 

或者三組:

Id Value GroupId 
1 A  1 
2 B  1 
3 C  2 
4 D  2 
5 E  3 
6 F  3 

我們有2 * 2 * 2 = 8間的關係:

A & C & E 
A & D & E 
B & C & E 
B & D & E 
A & C & F 
A & D & F 
B & C & F 
B & D & F 

但是,如何通過LINQ表達式做到這一點?我希望結果在View(剃鬚刀)中顯示。

更新: 我的意思是Cartesian Product表中的組成員。

+1

目前尚不清楚你所使用的「狀態」在這裏的意思是......你的意思是選擇來自各組一個項目?這些數據來自哪裏? (在LINQ to SQL中使用可能比較棘手,但在LINQ to Objects中相對比較簡單 – 2014-10-26 22:03:00

+0

@JonSkeet狀態是指成員之間根據組的關係建立的全部關係,從每個組中選擇一個條目與每個組成員一起顯示數據來自數據庫 – 2014-10-26 22:07:14

+0

我強烈建議你舉三個例子,目前你的問題還不太清楚, – 2014-10-27 11:01:25

回答

1

將羣組分組爲groups。將第一組移動到result。然後,對於每個剩餘group,與result加入他們:

 IEnumerable<string> result; 

     var groups = (from item in list 
         group item by item.GroupId into grp 
         select grp.Select(t => t.Value)).ToList(); 

     result = groups.First(); 

     groups.RemoveAt(0); 

     groups.ForEach(delegate(IEnumerable<string> value) 
      { 
       result = (from r in result 
         from v in value 
         select r + " " + v).ToList(); 

      }); 
+0

我測試過你的,沒有任何意義。你確定它的真正邏輯/語法嗎? – 2014-11-04 23:15:22

+0

我以爲你只是想要點數。我會嘗試編輯我的答案 – 2014-11-05 00:13:49

+0

請檢查編輯 – 2014-11-08 06:48:37

0

我不確定我是否正確理解您的問題,但在我看來,它是來自不同組的元素的過濾笛卡爾積。如果是這樣,這個代碼可以幫助:

var result = elements.SelectMany(x => elements, 
           (x, y) => Tuple.Create(x, y)) 
        .Where(t => t.Item1.GroupId < t.Item2.GroupId) 
        .Select(t => Tuple.Create(t.Item1.Value, t.Item2.Value)) 
        .ToList(); 

:此創建了非常大的收藏品時,使用一些臨時的對象,所以要注意。

+0

如果有三個組,我想這個OP需要三個值的元組,例如 – 2014-10-26 22:35:45

+0

@JonSkeet,真的,我們不知道,我明白這一點,讓我們等待OP澄清... – 2014-10-27 09:14:10

+0

OP已經澄清它 – 2014-10-27 11:14:00