Я знаю, что это очень субъективный вопрос (и тот, который может видеть шквал голосов "закрыть его" ), поэтому указывая его на CW и добавляя отказ от ответственности.
Во всяком случае, я работал над проектом в asp.net mvc, используя дозвуковой и внезапно (снова) пораженный элегантностью и "проницательностью" реализации linq, которая лежит на вершине как дозвукового, так и общего linq до библиотеки объектов. Это заставило меня немного приблизиться к моему коду и заставило меня понять, что некоторые из задач, которые я использовал linq для, будут бесконечно сложными (или "почти невозможными" - субъективными, конечно), если их попытают традиционным образом (это, конечно, вполне может быть ограничением во мне).
В любом случае, в результате этого я подумал, что было бы интересно посмотреть, с какими проблемами столкнулись люди, которые были изящно решены с помощью linq.
Чтобы начать, один сценарий, который я недавно использовал, имел объект, на котором было общее свойство "unitid". я хотел иметь возможность группировать набор из них, чтобы манипулировать и исследовать этот набор, когда он разбивается на соответствующие "унифицированные" группы. После долгих раздумий я подошел к этому простому маленькому линейному слою:
// the base collection of the objects - not grouped in any way
IQueryable<ShareholderRSP> rsps = validshareholderPounds
.Where(x => x.Balance > 0)
.OrderBy(x => x.RequestYear);
// the one-liner in question to group the objects by unitid
IList<IGrouping<string, ShareholderRSP>> groupedRSP =
rsps.ToList().GroupBy(t => t.UnitID.ToString()).ToList();
который затем я мог использовать как:
foreach (var rspGrpItem in groupedRSP)
{
foreach (var shareholderRSP in rspGrpItem)
{
// note, i could have also iterated this list too
// which is a base object contained within the collection
// underneath the group collection item
}
// create a top level summary grouped by unitid
// usedPounds is a variable created earlier on in the piece
bookingConfirm.RSPUnitSelect.Add(
new BookingConfirmRSPSelect
{
TotalBeforeUse = rspGrpItem.Sum(rsp => rsp.Balance),
TotalAfterUse = rspGrpItem.Sum(rsp => rsp.Balance) - usedPounds,
UnitNo = rspGrpItem.Key
}
);
}
Если бы я попытался сделать это традиционным способом, моя логика (на мой взгляд) была бы более громоздкой и менее способной адаптироваться к любым изменениям в базовой объектной модели.
Надеюсь, если это не совсем дискуссия, это подчеркнуло мою "радость" при использовании linq.
Все самое лучшее - надеюсь, что упущение объектной модели, о которой идет речь выше, не умаляет цели примера, поскольку, надеюсь, намерение раскрывает все.
Глядя на некоторые прекрасные примеры.
джим