Как мне сделать следующее, используя функцию LINQ C #? - PullRequest
0 голосов
/ 21 апреля 2011

Мне нужна помощь со следующим оператором, который будет преобразован в лямбда-оператор. Как мне это сделать?

for (int row = 0; row < rows; row++)
{
    for (int column = 0; column < columns; column++)
    {
        gList.Add(new G(this, new L(row, column), 0, 20, 30));
    }
}

спасибо за помощь !!!

Ответы [ 6 ]

2 голосов
/ 21 апреля 2011
var gList = from row in Enumerable.Range(0, rows)
            from col in Enumerable.Range(0, columns)
            select new G(this, new L(row, col), 0, 20, 30)

Мой любимый для встроенных декартов как этот

2 голосов
/ 21 апреля 2011
var gList = Enumerable.Range(0, rows)
    .SelectMany(row =>
        Enumerable.Range(0, columns)
            .Select(column => new G(this, new L(row, column), 0, 20, 30)
        )
    ).ToList() or .ToArray();

SelectMany сведет Enumerable, возвращаемый из Select, в IEnumerable.

1 голос
/ 21 апреля 2011

Как видно из других ответов, использование лямбд не всегда приводит к более чистому коду. Если у вас нет конкретной причины использовать лямбды в этом случае, я бы оставил циклы for как есть.

Читаемость должна быть вашей главной задачей, но я думаю, что использование обычного цикла for может быть немного быстрее, потому что у вас нет накладных расходов на вызовы функций, но разница в большинстве случаев не будет иметь значения.

1 голос
/ 21 апреля 2011

Дайте мне индексы, спроецируйте каждый индекс на новый L, спроецируйте каждый L на новый G и назначьте полученную последовательность объектов в список с именем gList.

var indexes = from row in Enumerable.Range(0, rows)
              from column in Enumerable.Range(0, columns)
              select new { Row = row, Column = column };
var ls = indexes.Select(index => new L(index.Row, index.Column));
var gs = ls.Select(l => new G(this, l, 0, 20, 30)).ToList();
var gList = gs.ToList();

Обратите внимание, что если gList - это существующий список, который вы хотите добавить, вы можете заменить последнюю строку на

gList.AddRange(gs);

Он читается точно так же, как и он.

1 голос
/ 21 апреля 2011
List<G> gList = Enumerable.Range(0, rows)
    .SelectMany(row => Enumerable.Range(0, columns)
        .Select(col => new G(this, new L(row, col), 0, 20, 30)))
    .ToList();
0 голосов
/ 21 апреля 2011

Помещение всего в одно выражение приведет к ужасному коду.Почему ты бы так поступил?Помогает ли следующее: (не проверено, из моей головы)

public IEnumerable<L> GenerateLs(int rows, int columns)
{
    for (int row = 0; row < rows; row++)
    {
        for (int column = 0; column < columns; column++)
        {
            yield return new L(row, column);
        }
    }
}

gList.Add(l => GenerateLs(rows,columns).Select(new G(this,l,0,20,30)));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...