c# - Linq 查询以获取列表中的不同值

标签 c# linq c#-4.0

假设这是我的成员(member)类

class Member 
{
    public string CategoryId { get; set; }
    public string MemberName { get; set; }
    public int Distance { get; set; }
}

而且,这是列表。

var list = new List<Member>();
list.Add(new { CategoryId = "01", MemberName="andy" Distance=3});
list.Add(new { CategoryId = "02", MemberName="john" Distance=5});
list.Add(new { CategoryId = "01", MemberName="mathew" Distance=7});
list.Add(new { CategoryId = "03", MemberName="bakara" Distance=2});

任何人都可以建议逻辑/linq 查询以获取具有不同/唯一 categoryID 和最短距离的列表。

输出应该是:

list.Add(new { CategoryId = "01", MemberName="andy" Distance=3});
list.Add(new { CategoryId = "02", MemberName="john" Distance=5});
list.Add(new { CategoryId = "03", MemberName="bakara" Distance=2});

最佳答案

这应该能满足您的需求:

var grouped = list.GroupBy(item => item.CategoryId);
var shortest = grouped.Select(grp => grp.OrderBy(item => item.Distance).First());

它首先将具有相同 CategoryId 的项目分组,然后从每组中选择第一个(按 Distance 排序)。


更新: 如果愿意,您也可以将所有这些链接在一起:

var shortest = list.GroupBy(item => item.CategoryId)
                   .Select(grp => grp.OrderBy(item => item.Distance)
                   .First());

关于c# - Linq 查询以获取列表中的不同值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20883890/

相关文章:

c# - .NET:有没有办法知道当前正在执行的代码在哪个方法中? (用于日志记录类)

c# - 来自用户输入的 Linq 查询

c# - LINQ 中的隐式转换错误

C# Entity Framework Core - LINQ 检查一个数组在另一个数组中是否存在

c#-4.0 - 在 Microsoft 堆栈上使用 Comet/XMPP 与 WebSocket 技术的实时 Web 通知和更新选项?

c# - 从 MVC 中的 web api 身份验证 token 中提取用户详细信息

c# - 使用自己的数据的 UserControl

c# - 如何在不复制 LINQ 的情况下接收评论最多的帖子

C#代码运行很慢

c# - 如果 Controller 与 View 强绑定(bind),为什么 Controller 需要模型参数?