【问题标题】:Linq, select List Item where column is the max valueLinq,选择列表项,其中列是最大值
【发布时间】:2014-08-14 22:10:49
【问题描述】:

我基本上有一个包含几列的列表。我要做的就是在名为 Counted 的列中选择具有最高 int 的列表项。

List<PinUp> pinned= new List<PinUp>();

class PinUp
{
    internal string pn { get; set; }
    internal int pi{ get; set; }
    internal int Counted { get; set; }
    internal int pp{ get; set; }
}

所以基本上我只想要pinned[whichever int has highested Count]

希望这是有道理的

问题是我想从当前列表中删除这个 [无论哪个 int 具有最高计数]。所以我必须不知道它在数组中是哪个 int

【问题讨论】:

  • 一旦你对列表中的项目进行了引用,你可以通过引用删除,不需要索引。
  • 这些列是否是唯一的?
  • 是否有可能多个PinUps 有相同的Counted-value?

标签: c# linq


【解决方案1】:

一种方式,按它订购:

PinUp highest = pinned
    .OrderByDescending(p => p.Counted)
    .First();

即使有多个最高的Counted,这也只会返回一个。所以另一种方式是使用Enumerable.GroupBy

IEnumerable<PinUp> highestGroup = pinned
    .GroupBy(p => p.Counted)
    .OrderByDescending(g => g.Key)
    .First();

如果你只是想获得最高的Counted(我怀疑),你只需要使用Enumerable.Max

int maxCounted = pinned.Max(p => p.Counted);

更新

问题是我想从当前列表中删除这个 [whichever int has highest Count]。

那么你可以使用List(T).RemoveAll:

int maxCounted = pinned.Max(p => p.Counted);
pinned.RemoveAll(p => p.Counted == maxCounted);

【讨论】:

  • Tim - 我不想要 Counted 的值,我想要项目数组编号
  • @CarstenKönig 我同意我本可以让问题更清楚,但是说 pinned[whichever int has highest Count] 会表明我想要数组中的特定项目
  • @CarstenKönig 不,这是错误的,OP 想要从列表中删除具有最高 Counted 值的项目。不过我已经更新了。
  • @CarstenKönig 有人说...“列表项在名为“....”的列中具有最高的 int
  • @CarstenKönig nope:“返回通用序列中的最大值。”来自:msdn.microsoft.com/en-us/library/vstudio/bb347632(v=vs.90).aspx。 List没有自己的Max,它使用LINQ扩展方法。
【解决方案2】:
var excludingHighest = pinned.OrderByDescending(x => x.Counted)
                             .Skip(1);

如果您需要一份被删除的副本并且仍然需要删除它,您可以执行类似的操作

var highestPinned = pinned.OrderByDescending(x => x.Counted).Take(1);
var excludingHighest = pinned.Except(highestPinned);

【讨论】:

  • 我不明白他为什么不能简单地使用pinned.RemoveAll(p =&gt; p.Counted==maxCounted)
  • @TimSchmelter 好吧,我从来没有说过他们不能。不过对我来说,RemoveAll 暗示可能不止一个。
  • @James:是的,但如果不是这样,它不会受到伤害。否则,这是删除所有具有最高价值的最简单的方法。如果有第二个 PinUp 具有此值,则 Skip(1)/Take(1) 失败,以及尝试查找单个项目或索引的其他方法。
  • @TimSchmelter 很好,这个问题被清楚地解释为它是一个单一的最大值(给定 OPs 描述),就像RemoveAll 会捕获匹配值一样,不需要来自 OP 的重复项。所以无论哪一种都可以,我猜哪一种适合他们,由 OP 决定。
【解决方案3】:

您可以订购:

var pin = pinned.OrderByDescending(p => p.Counted).FirstOrDefault();
// if pin == null then no elements found - probably empty.

如果要删除,则不需要索引:

pinned.Remove(pin);

【讨论】:

  • 如果多个PinUps 有这个Counted
【解决方案4】:

这是一个排序问题。 按Counted 降序排列您的列表并选择第一项。 Linq 有办法做到这一点:

var highest = pinned.OrderByDescending(p => p.Counted).FirstOrDefault();

【讨论】:

    【解决方案5】:

    尝试以下方法:

    PinUp pin = pinned.OrderByDescending(x => x.Counted).First();
    

    【讨论】:

    • 你需要一个选择器,比如First/FirstOrDefault
    猜你喜欢
    • 1970-01-01
    • 2014-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多