Операторы C# Linq или foreach () для в общей сложности подмножеств?

Я никогда не работал с PHP (ничего особенного) и пришел из мира .NET. Проект, над которым я сейчас работаю, требует много работы с Python, и я должен сказать, что мне это нравится. Очень легкий и "крутой" язык, т.е. FUN!

.NET всегда будет моей женой, но Python - моя любовница;)

6
задан CaptainCasey 22 June 2009 в 05:06
поделиться

5 ответов

Оба этих примера содержат дублированный код, и оба не готовы к изменению типа - что, если бы он имел три значения? Что, если бы их было 30?
Вы можете использовать linq для группировки по нему и получения итога:

var totals = from p in exampleList
             group p by p.Type into g
             select new { Type = g.Key, Total = g.Sum(p => p.Total ) };

Итак totals - это набор объектов со свойствами Type и Total

4
ответ дан 8 December 2019 в 14:46
поделиться

Независимо от размера списка, если вы ориентируетесь на .NET 3.5, я бы выбрал LINQ, хотя бы для удобства чтения.

Я большой любитель писать то, что вы имеете в виду, а не как это делается, и LINQ упрощает это в таких случаях.

Вы, вероятно, даже можете объединить вычисления в один оператор LINQ, сгруппированный по типу. Таким образом, у вас не будет двух циклов для LINQ, а будет только один, как во втором примере:

var subtotals = from x in exampleList
                group x by x.Type into g
                select new { Type = x.Key, SubTotal = g.Sum(x => x.Total) };

(Не совсем уверен, работает ли код как он, это просто быстрая адаптация из одного из 101 примеров LINQ . Однако синтаксис должен быть в порядке.)

5
ответ дан 8 December 2019 в 14:46
поделиться

Вариант 3

var groupings = exampleList
    .GroupBy(x => x.Type, x => x.Total)
    .Select(x => new { Type = x.Key, SubTotal = x.Sum() } );

У вас будет следующий список классов:

class <Anonymous>
{
    public string Type { get; }    
    public decimal SubTotal { get; }  
}

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

4
ответ дан 8 December 2019 в 14:46
поделиться

Я не думаю, что для таких небольших списков будет большая разница в производительности.

Вариант 1 будет повторять список дважды, тогда как Вариант 2 выполняет итерацию по списку только один раз. Это может быть важнее для больших списков, чем для маленьких.

Вариант 1 более читабелен, но я определенно сделаю комментарий, что он повторяет список дважды.

Очевидное преимущество варианта 2 состоит в том, что код работает в .NET Framework 2.0. Использование LINQ означает, что вашему приложению требуется .NET Framework 3.5.

2
ответ дан 8 December 2019 в 14:46
поделиться

Для варианта 1 внутренний цикл foreach будет выполняться дважды Среда выполнения C #. Следовательно, тип обработки будет больше. Но для <10 элементов это почти не имеет значения, и вариант 1 кажется более читаемым. Я бы выбрал вариант 1 для <10 товаров.

1
ответ дан 8 December 2019 в 14:46
поделиться
Другие вопросы по тегам:

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