我有字符串列表如何獲得「無序選二」的字符串在C#中的列表排列
List< String> lst
A
B
C
我需要與其他項目每個項目的組合添加到列表中像
A
B
C
A-B
A-C
B-C
現在我正在使用嵌套循環爲此。
有沒有辦法使用linq做到這一點?
在此先感謝
我有字符串列表如何獲得「無序選二」的字符串在C#中的列表排列
List< String> lst
A
B
C
我需要與其他項目每個項目的組合添加到列表中像
A
B
C
A-B
A-C
B-C
現在我正在使用嵌套循環爲此。
有沒有辦法使用linq做到這一點?
在此先感謝
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);
我對LINQ不太熟悉,但試圖學習,主要是從這裏的udnerstanding示例學習......這是否會返回A-C以及C-A?這是我認爲它應該做的,但只是想檢查... :) – Chris 2010-09-02 15:39:36
只是爲了完整性,在這裏書寫流利聲明:
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);
除了以前的答案,你可能會通過埃裏克利珀興趣this article。
正如我在我的評論中提到的,我覺得你想要什麼或者是排列(你重新排列的有序集合)或組合(你在哪裏得到一組無序的無序的子集)
做所有這些事情在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
所以如果你可以計數,你可以產生功率集。
你想要什麼?
我注意到你實際上並沒有在這裏獲得笛卡爾乘積,你得到了「無序選擇兩個」排列。笛卡爾產品將是{AA,AB,AC,BA,BB,BC,CA,CB,CC}九個元素。 「無序選擇兩個」排列只有三個項目{AB,AC,BC}。我認爲你的問題有錯誤的標題;我認爲你根本不在尋找笛卡爾產品。 – 2010-09-01 18:33:00