C# 仅从阵列中选择最佳项目
我绞尽脑汁想得到一个linq语句,在这个语句中,我只想选择数组中具有最高版本的一些项。 给定一系列应用程序,例如:C# 仅从阵列中选择最佳项目,c#,arrays,linq,sorting,C#,Arrays,Linq,Sorting,我绞尽脑汁想得到一个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来只选择1个adobe应用程序,一个版本最高的应用
[{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来只选择1个adobe应用程序,一个版本最高的应用程序和1个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唯一的方法来做到这一点。有什么建议吗
谢谢。您可以尝试以下方式:
var latest = apps.GroupBy(x=>x.name)
.Select(x=> new
{
Name=x.Key,
Version = x.OrderByDescending(y=>y.version)
.First().version
});
最初,我们创建一个
GroupBy
应用程序的名称。然后我们选择每个组的项目,使用最新版本。您可以使用可枚举。GroupBy
:
IEnumerable<SomeClass> latest = apps
.GroupBy(n => n.name)
.Select(nameGroup => nameGroup.OrderByDescending(n => n.version).First());
IEnumerable latest=应用程序
.GroupBy(n=>n.name)
.Select(nameGroup=>nameGroup.OrderByDescending(n=>n.version.First());
这里有一个更简单的方法:
var latest = apps.GroupBy(i => i.Name)
.Select(i => i.OrderByDescending(j => j.Version).First());
对于包含Max()和不包含Max()的小集合(选择+GroupBy()): 以下是我的看法:
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();
}
欢迎来到StackOverflow!请看,其中的共识是“不,他们不应该”。如果有另一个应用程序(“记事本”)版本为1-4,您希望发生什么?你也想要Adobe和VLC v3吗?你知道这个类吗?最后我想你想要
.First().version
如果你需要包含另一个属性怎么办。。。像ReleaseDate或DownloadSize属性之类的东西?您不能执行Version=x.Max(y=>y.Version)吗?Jonesy是对的。现在,它要求的第一项是version为true,这意味着它不应该编译,因为version不是布尔值。@TimSchmelter所需的输出与输入的类型相同;-)这也不简单,但不同。@tim schmelter Doh!你公平地打败了我。(我只是想争取到15岁,这样我就可以投票选出正确的答案。)
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();
}