从数组中选择最好的项目

时间:2014-11-19 14:44:53

标签: 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才能选择一个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才能做到这一点。有什么建议吗?

谢谢。

5 个答案:

答案 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);