我很想找到一个linq语句,我想只选择数组中具有最高版本的一些项目。 给定一系列应用程序,例如:
[{name="Adobe", version=1},
{name="Adobe", version=2},
{name="Adobe", version=3},
{name="VLC", version=1},
{name="VLC", version=2},
{name="VLC", version=3}]
我需要一个linq才能选择一个adobe应用程序,一个版本最高的应用程序和一个VLC应用程序。 结果应如下所示:
[{name="Adobe", version=3},
{name="VLC", version=3}]
到目前为止我得到的最好的是:
var names = apps.Select((n => n.name)).Distinct();
foreach (var name in names)
{
var latest = apps.Where(n => n.name == name).OrderByDescending(n => n.version).FirstOrDefault();
//add latest to the new appList
}
我一直在思考是否有一种更简单,只有linq才能做到这一点。有什么建议吗?
谢谢。
答案 0 :(得分:5)
您可以尝试这样的事情:
var latest = apps.GroupBy(x=>x.name)
.Select(x=> new
{
Name=x.Key,
Version = x.OrderByDescending(y=>y.version)
.First().version
});
最初,我们制作了GroupBy
应用名称。然后我们选择每个组的项目,并使用最新版本。
答案 1 :(得分:2)
这是一种更简单的方法:
var latest = apps.GroupBy(i => i.Name)
.Select(i => i.OrderByDescending(j => j.Version).First());
答案 2 :(得分:2)
这是我的看法:
void Main()
{
var apps = new NameVersion[]
{
new NameVersion {name="Adobe", version=1},
new NameVersion {name="Adobe", version=2},
new NameVersion {name="Adobe", version=3},
new NameVersion {name="VLC", version=1},
new NameVersion {name="VLC", version=2},
new NameVersion {name="VLC", version=3}
};
var q = from a in apps
group a by a.name into g
select new NameVersion { name=g.Key, version = g.Max(a=> a.version)};
q.Dump();
}
答案 3 :(得分:1)
您可以使用Enumerable.GroupBy
:
IEnumerable<SomeClass> latest = apps
.GroupBy(n => n.name)
.Select(nameGroup => nameGroup.OrderByDescending(n => n.version).First());
答案 4 :(得分:0)
对于使用Max()和不使用(Select + GroupBy())的小型集合:
var list = apps.ToList();
var res = list.Where(
x => list.Where(elem=>elem.name == x.name)
.Max(elem=>elem.version) == x.version);