LINQ запрашивают с несколькими агрегатами

Вы можете изменить историю этой ветви функций и принудительно нажать ее, эффективно переписав последовательность коммитов на стороне удаленного репо.

Но, конечно, это не изменило бы потенциальные вытягивания / слияния, сделанные до этого второго толчка, поэтому связь была бы ключевой в дополнении исправления истории.

6
задан John Sheehan 17 October 2008 в 05:55
поделиться

3 ответа

Вы не можете эффективно выбрать несколько агрегатов в ванильном LINQ к Объектам. Можно выполнить несколько запросов, конечно, но это может быть неэффективно в зависимости от источника данных.

У меня есть платформа, которая справляется с этим, которое я называю "Нажатие LINQ" - это - только хобби (для меня и Marc Gravell), но мы полагаем, что это работает вполне прилично. Это доступно как часть MiscUtil, и можно читать об этом в моем сообщении в блоге на нем.

Это выглядит немного нечетным - потому что Вы определяете, где Вы хотите, чтобы результаты пошли как "фьючерсы", затем продвиньте данные через запрос, затем получите результаты - но после того как Вы получаете голову вокруг него, это прекрасно. Мне было бы интересно слышать, как Вы продолжаете его - при использовании его отправьте мне по почте по skeet@pobox.com.

2
ответ дан 17 December 2019 в 02:35
поделиться

Единственное перечисление, приводящее и к минуте и макс. (и любой другой агрегат Вы хотите бросить там). Это намного легче в vb.net.

Я знаю, что это не обрабатывает пустой ящик. Это довольно легко добавить.

    List<int> myInts = new List<int>() { 1, 4, 2, 0, 3 };
    var y = myInts.Aggregate(
        new { Min = int.MaxValue, Max = int.MinValue },
        (a, i) =>
        new
        {
           Min = (i < a.Min) ? i : a.Min,
           Max = (a.Max < i) ? i : a.Max
        });
    Console.WriteLine("{0} {1}", y.Min, y.Max);
4
ответ дан 17 December 2019 в 02:35
поделиться

Можно делать несколько агрегатов с Linq-к объектам, но это немного уродливо.

var times = punches.Aggregate(
    new { EarliestIn = default(DateTime?), LatestOut = default(DateTime?) },
    (agg, p) => new {
        EarliestIn = Min(
            agg.EarliestIn,
            p.type == "In" ? (DateTime?)p.PunchTime : default(DateTime?)),
        LatestOut = Max(
            agg.LatestOut,
            p.type == "Out" ? (DateTime?)p.PunchTime : default(DateTime?)) 
    }
);

Вам также потребуется минимальные и максимальные функции для DateTime, поскольку они не доступны стандарты.

public static DateTime? Max(DateTime? d1, DateTime? d2)
{
    if (!d1.HasValue)
        return d2;
    if (!d2.HasValue)
        return d1;
    return d1.Value > d2.Value ? d1 : d2;
}
public static DateTime? Min(DateTime? d1, DateTime? d2)
{
    if (!d1.HasValue)
        return d2;
    if (!d2.HasValue)
        return d1;
    return d1.Value < d2.Value ? d1 : d2;
}
0
ответ дан 17 December 2019 в 02:35
поделиться
Другие вопросы по тегам:

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