Генерация всех возможных комбинаций нескольких столбцов в .NET - PullRequest
2 голосов
/ 22 августа 2010

У меня как 4 столбца в файле, каждый столбец содержит количество значений, более или менее. Мне нужно получить все возможные комбинации, при этом порядок столбцов и количество секций в результирующих строках должны оставаться неизменными.

например. первый столбец содержит числа в диапазоне 1-100, второй: буквы a-z, а третий также числовой, я бы получил что-то вроде

1-А-1, 2-А-1, 3-А-1; 1-B-1, 1-B-2, 1-B-3 и т. Д.

Ответы [ 2 ]

4 голосов
/ 22 августа 2010

Существуют различные универсальные подходы к этому, но самый простой для случая, когда вы точно знаете, сколько у вас столбцов, это просто использовать вложенные циклы:

foreach (var a in firstColumn)
{
    foreach (var b in secondColumn)
    {
        foreach (var c in thirdColumn)
        {
           foreach (var d in fourthColumn)
           {
               // Do something with a, b, c, d
           }
        }
    }
}

Альтернатива с использованием LINQ:

var query = from a in firstColumn
            from b in secondColumn
            from c in thirdColumn
            from d in fourthColumn
            select new { a, b, c, d };
foreach (var tuple in query)
{
    // Do something with tuple.a, tuple.b etc
}
0 голосов
/ 22 августа 2010

Предполагается, что вы проанализировали файл в списке Foo объектов, где каждое свойство содержит значение столбца:

class Foo
{
    public string Column1 { get; set; }
    public string Column2 { get; set; }
    public string Column3 { get; set; }
    public string Column4 { get; set; }
}

List<Foo> list = ParseFile();


var query = from f1 in list
            from f2 in list
            from f3 in list
            from f4 in list
            select new Foo
            {
                Column1 = f1.Column1,
                Column2 = f2.Column2,
                Column3 = f3.Column3,
                Column4 = f4.Column4,
            };

Foo[] combinations = query.ToArray();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...