我有一个项目列表
- 约翰身份证
- 马特·艾德
- 约翰身份证
- 斯科特身份证
- 马特·艾德
- 约翰身份证
- 卢卡斯身份证
我想像这样将它们推回到列表中,这也意味着我想按重复项的最高数量排序。
- 约翰 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/