【问题标题】:LINQ in a IEnumerable?IEnumerable 中的 LINQ?
【发布时间】:2011-12-06 14:12:51
【问题描述】:

我需要得到不同列的总和。数据:

<name>Nina</name>
<avd>Soft</avd>
<reg>Mara</reg>
<salg>11</salg>
<oms>13000000</oms>
<hen>10</hen>

<name>Vera</name>
<avd>Soft</avd>
<reg>Mara</reg>
<salg>1</salg>
<oms>1520000</oms>
<hen>0</hen>

<name>Hans</name>
<avd>Hard</avd>
<reg>Mes</reg>
<salg>2</salg>
<oms>6130000</oms>
<hen>0</hen>

<name>Egzona</name>
<avd>Hard</avd>
<reg>Mes</reg>
<salg>6</salg>
<oms>10505000</oms>
<hen>35</hen>

例如: 我需要知道希望“reg”或“avd”的结果最多(salg * 0.8 + hen * 0.2)

我正在使用 .net 4 c#

这是一个 IEnumerable,所以我可以使用 Select()。

【问题讨论】:

  • 您是否将数据存储为 XML 并将其反序列化为持有某种对象的 IEnumerable
  • 我有一个 IEnumerable 类

标签: c# .net xml linq linq-to-xml


【解决方案1】:

您可以订购物品并拿走第一个:

var maxItem = items.OrderByDescending(x => x.Salg * 0.8 + x.Hen * 0.2)
                   .First();

以上假设您有一个具有SalgHen 属性的类。如果您的项目仍然是 XML,您将不得不使用 Element() 方法来访问这些属性。

或者,您可以使用 MoreLinq 项目中的 MaxBy(),这会更有效:

var maxItem = items.MaxBy(x => x.Salg * 0.8 + x.Hen * 0.2); 

编辑:

鉴于更新 - 您需要按名称对数据进行分组,对每个组求和并按总和降序排列,如下所示:

var bestSalePersons = items.GroupBy(x => x.Name)
                           .Select(g => new { Name = g.Key, Sum = g.Sum(i => i.Salg * 0.8 + i.Hen * 0.2) })
                           .OrderByDescending(x => x.Sum)
                           .Take(5);

【讨论】:

  • 嗯...问题是需要做一些分数,比如前 5 名,我使用 take(5) 而不是 .First(),但我得到了重复的。
  • 使用第一种方法,然后使用Take(5) 而不是First()
  • 对您来说,什么构成重复?同名?
  • 像这样:1. Mara 44 2. Mara 34 3. San Diego 30 4. San Diego 24 5. New York 10
  • 更新了答案-从您在问题中提供的示例中根本不清楚
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-18
  • 2010-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多