Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 仅从阵列中选择最佳项目_C#_Arrays_Linq_Sorting - Fatal编程技术网

C# 仅从阵列中选择最佳项目

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应用程序,一个版本最高的应用

我绞尽脑汁想得到一个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应用程序,一个版本最高的应用程序和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();
}