2010-09-01 24 views
1

我有字符串列表如何獲得「無序選二」的字符串在C#中的列表排列

List< String> lst 

A 
B 
C 

我需要與其他項目每個項目的組合添加到列表中像

A 
B 
C 
A-B 
A-C 
B-C 

現在我正在使用嵌套循環爲此。

有沒有辦法使用linq做到這一點?

在此先感謝

+1

我注意到你實際上並沒有在這裏獲得笛卡爾乘積,你得到了「無序選擇兩個」排列。笛卡爾產品將是{AA,AB,AC,BA,BB,BC,CA,CB,CC}九個元素。 「無序選擇兩個」排列只有三個項目{AB,AC,BC}。我認爲你的問題有錯誤的標題;我認爲你根本不在尋找笛卡爾產品。 – 2010-09-01 18:33:00

回答

7
var sourceStrings = new List<string> {"A", "B", "C"}; 

var resultStrings = from a in sourceStrings 
        from b in sourceStrings 
        where a != b 
        select a + "-" + b; 

foreach (var result in resultStrings) 
    Console.WriteLine(result); 
+0

我對LINQ不太熟悉,但試圖學習,主要是從這裏的udnerstanding示例學習......這是否會返回A-C以及C-A?這是我認爲它應該做的,但只是想檢查... :) – Chris 2010-09-02 15:39:36

4

只是爲了完整性,在這裏書寫流利聲明:

var sourceStrings = new List<string> { "A", "B", "C" }; 

var resultStrings = sourceStrings.SelectMany(a => sourceStrings, 
              (a, b) => new { a, b }) 
           .Where(n => n.a != n.b) 
           .Select(n => n.a + "-" + n.b); 

foreach (var result in resultStrings) 
    Console.WriteLine(result); 
6

除了以前的答案,你可能會通過埃裏克利珀興趣this article

4

正如我在我的評論中提到的,我覺得你想要什麼或者是排列(你重新排列的有序集合)或組合(你在哪裏得到一組無序的無序的子集)

做所有這些事情在C#通用庫可以在這裏找到:

http://www.codeproject.com/KB/recipes/Combinatorics.aspx

它仍然不是100%我清楚你想要什麼。下面是一些選項:

設S是集合{A,B,C}

笛卡爾乘積S×S個是AA,AB,AC,BA,BB,BC,CA,CB,CC。這是兩個元素的每種可能的組合,包括重複的順序。

「S置換2」是AB,AC,BA,BC,CA,CB。也就是說,兩個元素的每一種可能的組合,順序都很重要,但是沒有重複。

「S選擇2」是AB,AC,BC。也就是說,兩個元素的每個可能的組合,沒有順序,沒有重複。

「S的功率集」是什麼,A,B,C,AB,AC,BC,ABC。也就是說,每個可能的零,一,二或三個元素的組合,沒有順序。

您可以通過以二進制計數來生成功率集(如果這是您想要做的)。考慮二進制數字0到7:

ABC 
000 0 nothing 
001 1 C 
010 2 B 
011 3 BC 
100 4 A 
101 5 AC 
110 6 AB 
111 7 ABC 

所以如果你可以計數,你可以產生功率集。

你想要什麼?

相關問題