thể trùng lặp:
Generating all Possible Combinations
Is there a good LINQ way to do a cartesian product?
How to generate combination of N elements with limited supply of 2 each without explicit nested loopsSử dụng LINQ to lặp kết hợp
Tôi có một danh sách liệt kê, và tôi muốn lặp tất cả các kết hợp có thể nơi tôi chọn một phần tử từ mỗi danh sách bên trong. Điều này là khá đơn giản nếu tôi biết tại thời gian biên dịch có bao nhiêu danh sách có, nhưng làm thế nào tôi có thể làm điều đó khi tôi không biết trước bao nhiêu danh sách sẽ có?
Nếu tôi có ba danh sách (và nếu tôi biết, tại thời gian biên dịch, sẽ có chính xác ba danh sách) và tôi muốn tất cả các kết hợp chọn một phần tử từ mỗi danh sách dễ dàng với truy vấn LINQ:
var list1 = new[] { 1, 2 };
var list2 = new[] { 3, 4 };
var list3 = new[] { 5, 6 };
var combinations = from item1 in list1
from item2 in list2
from item3 in list3
select new[] { item1, item2, item3 };
// Results:
// {1, 3, 5}
// {1, 3, 6}
// {1, 4, 5}
// {1, 4, 6}
// {2, 3, 5}
// {2, 3, 6}
// {2, 4, 5}
// {2, 4, 6}
Nhưng làm cách nào tôi có thể làm điều tương tự khi tôi không biết thời gian biên dịch bao nhiêu danh sách?
var lists = new[] {
new[] { 1, 2 },
new[] { 3, 4 },
new[] { 5, 6 } };
var combinations = ???;
// This particular example happens to be the same inputs as above, so it
// has the same expected outputs. But there could be two lists instead,
// or four, so the three hard-coded "from" clauses won't work.
Nó có vẻ như điều này thực sự nên được doable trong LINQ - SelectMany đã thực hiện tương đương với hai vòng foreach lồng nhau, vì vậy tất cả những gì cần làm là làm một loạt các cuộc gọi SelectMany và sau đó kết hợp tất cả các kết quả với một SelectMany khác. Hoặc một cái gì đó. Nhưng khi nó bắt đầu nhận được meta như vậy, bộ não của tôi được tất cả gắn liền với nút thắt. Tôi không thể có được một xử lý về cách đặt các mảnh lại với nhau. Tôi thậm chí không thể tìm ra các đối số kiểu chung cho cuộc gọi SelectMany bên ngoài sẽ là gì.
Làm cách nào để có thể lặp lại danh sách danh sách đó và trả về tất cả các kết hợp mà không biết thời gian biên dịch sẽ có bao nhiêu danh sách?
(Lưu ý: ở mọi nơi tôi đã sử dụng mảng ở trên, tôi muốn sử dụng IEnumerable<T>
thay thế. Mảng dễ viết hơn trong mã mẫu, nhưng tôi mong rằng đầu ra có nhiều khả năng ở dạng IEnumerable<IEnumerable<int>>
hơn là so với số int[][]
Tôi hiển thị trong kết quả mẫu của mình ở trên.)
và đây là [câu trả lời] của bạn (http://stackoverflow.com/questions/3093622/generating-all-possible-combinations/3098381#3098381) –
Đây không phải là bản sao của một trong những câu hỏi * * - cả hai các câu hỏi đang hỏi về một số danh sách cố định - nhưng cả hai câu hỏi đều có chứa một câu trả lời * * (câu trả lời của cùng một người trong cả hai trường hợp!) cho trường hợp biến số-liệt kê. –
@Steven, câu hỏi bạn đã liên kết là mới hơn của tôi, vì vậy nếu có bất cứ điều gì, nó trùng lặp với câu hỏi này. –