c# - 如何使用 LINQ 计算列表中的重复项

标签 c# linq

我有一个项目列表

  • 约翰身份证
  • 马特·艾德
  • 约翰身份证
  • 斯科特身份证
  • 马特·艾德
  • 约翰身份证
  • 卢卡斯身份证

我想像这样将它们推回到列表中,这也意味着我想按重复项的最高数量排序。

  • 约翰 ID 3
  • 马特 ID 2
  • 斯科特 ID 1
  • 卢卡斯 ID 1

请告诉我如何使用 LINQ 和 C# 完成此操作。

谢谢大家

编辑 2 显示代码:

    List<game> inventory = new List<game>();
    drinkingforDataContext db = new drinkingforDataContext();
    foreach (string item in tbTitle.Text.Split(' '))
    {

        List<game> getItems = (from dfg in db.drinkingfor_Games
                               where dfg.game_Name.Contains(tbTitle.Text)
                               select new game
                               {
                                   gameName = dfg.game_Name,
                                   gameID = Boomers.Utilities.Guids.Encoder.EncodeURLs(dfg.uid)
                               }).ToList<game>();

        for (int i = 0; i < getItems.Count(); i++)
        {
            inventory.Add(getItems[i]);
        }
    }

    var items = (from xx in inventory
                 group xx by xx into g
                 let count = g.Count()
                 orderby count descending
                 select new
                    {
                        Count = count,
                        gameName = g.Key.gameName,
                        gameID = g.Key.gameID
                    });

    lvRelatedGames.DataSource = items;
    lvRelatedGames.DataBind();

此查询显示这些结果:

  • 1 次 Hello World
  • 1 次 Hello World
  • 1 个 Hello World 。
  • 1 次 Hello World
  • 1 次 Hello World
  • 1 次 Hello World
  • 1 个 Hello World 。
  • 1 次 Hello World

它给了我数量和名称,但没有给我游戏的 ID....

它应该显示:

  • 6 Hello World 时间 234234
  • 2 Hello World 。 23432432

最佳答案

您可以使用“group by”+“orderby”。参见 LINQ 101详情

var list = new List<string> {"a", "b", "a", "c", "a", "b"};
var q = from x in list
        group x by x into g
        let count = g.Count()
        orderby count descending
        select new {Value = g.Key, Count = count};
foreach (var x in q)
{
    Console.WriteLine("Value: " + x.Value + " Count: " + x.Count);
}

回应this post (现已删除):

如果您有一些自定义对象的列表,那么您需要使用 custom comparer或按特定属性分组。

查询也无法显示结果。向我们展示完整的代码以获得更好的帮助。

基于您的最新更新:

你有这行代码:

group xx by xx into g

因为 xx 是自定义对象系统不知道如何将一个项目与另一个项目进行比较。 正如我已经写过的,您需要指导编译器并提供一些将在对象比较中使用的属性或提供自定义比较器。这是一个例子:

请注意,我使用 Foo.Name 作为键 - 即对象将根据 Name 属性的值进行分组。

有一个问题 - 您根据名称将 2 个对象视为重复对象,但是 Id 呢?在我的示例中,我只获取组中第一个对象的 Id。如果您的对象具有不同的 ID,则可能会出现问题。

//Using extension methods
var q = list.GroupBy(x => x.Name)
            .Select(x => new {Count = x.Count(), 
                              Name = x.Key, 
                              ID = x.First().ID})
            .OrderByDescending(x => x.Count);

//Using LINQ
var q = from x in list
        group x by x.Name into g
        let count = g.Count()
        orderby count descending
        select new {Name = g.Key, Count = count, ID = g.First().ID};

foreach (var x in q)
{
    Console.WriteLine("Count: " + x.Count + " Name: " + x.Name + " ID: " + x.ID);
}

关于c# - 如何使用 LINQ 计算列表中的重复项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/454601/

相关文章:

c# - 在 wpf 用户控件中公开一个字段以供外部使用

c# - 如何为 Contains<T> 构建表达式树

c# - 如果 users.Claims 包含等于参数的声明 (LINQ),则为 linq 语句

c# - 通用列表到 EntitySet 的转换

c# - 将两步 LINQ 查询转换为单个 LET 查询?

c# - Htmlagilitypack 显示节点 #text 而不是 span

c# - 如何在c#中的datagridview中的两行之间添加行

c# - 日期不会去Mysql数据库c#

c# - Windows 服务总线向 MSMQ 添加了什么?

带有默认值的 C# LINQ SelectMany