Инициализируйте зубчатый массив путь LINQ

Я предполагаю, что Вы знаете то, что они делают, и таким образом используются по-другому, таким образом, я собираюсь понять Ваш вопрос как: Когда был бы, это быть хорошей идеей переписать SQL для использования ВО вместо СУЩЕСТВУЕТ, или наоборот.

, который является справедливым предположением?

<час>

Редактирование : причина, которую я спрашиваю, состоит в том, что во многих случаях можно переписать SQL на основе В использовать СУЩЕСТВОВАНИЕ вместо этого, и наоборот, и для некоторых механизмов базы данных, оптимизатор запросов будет рассматривать два по-другому.

, Например:

SELECT *
FROM Customers
WHERE EXISTS (
    SELECT *
    FROM Orders
    WHERE Orders.CustomerID = Customers.ID
)

может быть переписан к:

SELECT *
FROM Customers
WHERE ID IN (
    SELECT CustomerID
    FROM Orders
)

или с соединением:

SELECT Customers.*
FROM Customers
    INNER JOIN Orders ON Customers.ID = Orders.CustomerID

, Таким образом, мой вопрос все еще стоит, исходный плакат задается вопросом о том, что В и СУЩЕСТВУЕТ, делает, и таким образом как использовать его, или он спрашивает, существует ли перезапись использования SQL В использовать вместо этого, или наоборот, будет хорошей идеей?

9
задан James M. 8 July 2009 в 18:14
поделиться

4 ответа

double[][] myArr = Enumerable
  .Range(0, rowCount)
  .Select(i => new double[colCount])
  .ToArray();
24
ответ дан 4 December 2019 в 08:34
поделиться

То, что у вас есть, не будет работать, так как новый возникает до вызова Repeat . Вам нужно что-то, что также повторяет создание массива. Этого можно достичь с помощью метода Enumerable.Range для создания диапазона и последующего выполнения операции Select , которая сопоставляет каждый элемент диапазона с новым экземпляром массива. (как в ответ Эми Б. ).

Однако я думаю, что вы пытаетесь использовать LINQ там, где в данном случае это нецелесообразно. То, что у вас было до решения LINQ, прекрасно. Конечно, если вам нужен подход в стиле LINQ, подобный Enumerable.Repeat , вы можете написать свой собственный метод расширения, который генерирует новый элемент, например:

    public static IEnumerable<TResult> Repeat<TResult>(
          Func<TResult> generator,
          int count)
    {
        for (int i = 0; i < count; i++)
        {
            yield return generator();
        }
    }

Затем вы можете вызвать его следующим образом:

   var result = Repeat(()=>new double[rowCount], columnCount).ToArray();
2
ответ дан 4 December 2019 в 08:34
поделиться

Поведение правильное - Repeat () возвращает последовательность, содержащую предоставленный объект несколько раз. Вы можете проделать следующий трюк.

double[][] myArr = Enumerable
    .Repeat(0, rowCount)
    .Select(i => new double[colCount])
    .ToArray();
0
ответ дан 4 December 2019 в 08:34
поделиться

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

    public static IEnumerable<T> Sequence<T>(Func<T> generator, int count)
    {
        for (int i = 0; i < count; i++)
        {
            yield return generator();
        }
    }

    ...

    var myArr = Sequence(() => new double[colCount], rowCount).ToArray();
0
ответ дан 4 December 2019 в 08:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: