Что-то лучше, чем .ToArray () для принудительного перечисления вывода LINQ

byte[] IntToByteArray( int data ) {

byte[] result = new byte[4];

result[0] = (byte) ((data & 0xFF000000) >> 24);
result[1] = (byte) ((data & 0x00FF0000) >> 16);
result[2] = (byte) ((data & 0x0000FF00) >> 8);
result[3] = (byte) ((data & 0x000000FF) >> 0);

return result;
}
13
задан Jon Norton 24 November 2008 в 23:13
поделиться

4 ответа

Только для проверки я понимаю Вас - Вы в основном хотите выполнить итерации через все результаты, только вызвать какие-либо побочные эффекты произойти?

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

foreach (var result in aggregationResult)
{
    // Deliberately empty; simply forcing evaluation of the sequence.
}

, Кроме того, Вы могли использовать LastOrDefault () для предотвращения всего копирования, привлеченного в ToArray (). количество () будет хорошо, пока результат не реализует IList<T> (который включает ярлык).

15
ответ дан Jon Skeet 24 November 2008 в 23:13
поделиться

Лучше избежать функций побочного эффекта как modifyCollection выше.

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

var modifiedCollection = ModifyCollection(collection, collectionNeedsModification);

var aggregationResult = from a in
                        (from b in modifiedCollection
                         where b.SatisfysCondition)
                         .Aggregate(aggregationFunction)
                    select a.NeededValue;

, Где ModifyCollection является методом, который возвращает измененный набор (или запрос) в параметре в зависимости от collectionNeedsModification булева параметра.

3
ответ дан Aleris 24 November 2008 в 23:13
поделиться

Я не думаю, что существует проблема с Вашим подходом, если Вы будете всегда использовать результат (так как Ваш набор результатов не является большим, это не использует много памяти. Между прочим, если Вы сделаете это и никогда не будете использовать результат, то он наложит потерю производительности). Так, да, это - корректный способ сделать это.

0
ответ дан Mehrdad Afshari 24 November 2008 в 23:13
поделиться

(Примечание: ввод без компилятора, поэтому код не протестирован)

Если у вас уже есть Reactive Extensions для .NET в качестве зависимости, вы можете использовать Run ():

aggregationResult.Run();

Но, возможно, не стоит добавлять для этого зависимость.

Вы также можете реализовать метод Run самостоятельно как метод расширения:

public static MyLinqExtensions 
{
     public static void Run<T>(this IEnumerable<T> e)
     {
         foreach (var _ in e);
     }
}
13
ответ дан 1 December 2019 в 20:13
поделиться
Другие вопросы по тегам:

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