我有一张物品清单
- John ID
- Matt ID
- John ID
- Scott ID
- Matt ID
- John ID
- 卢卡斯身份证
我想把它们放回一个列表中,这也意味着我想按重复数最多的排序。
- 约翰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你好世界时报
- 1你好世界时报
- 1 Hello World.
- 1你好世界时报
- 1你好世界时报
- 1你好世界时报
- 1 Hello World.
- 1你好世界时报
它给了我计数和名称,但它没有给我游戏的ID。
它应该显示:
- 6你好世界时报234234
- 2 Hello World. 23432432
7条答案
按热度按时间7kjnsjlb1#
您可以使用“group by”+“orderby”。详情请参见LINQ 101
回复此帖子(现已删除):
如果你有一个自定义对象的列表,那么你需要使用自定义比较器或按特定属性分组。
查询也无法显示结果。给我们完整的代码,以获得更好的帮助。
基于您的最新更新:
你有这样一行代码:
由于xx是一个自定义对象,系统不知道如何将一个项与另一个项进行比较。正如我已经写过的,你需要引导编译器并提供一些将在对象比较中使用的属性或提供自定义比较器。下面是一个示例:
请注意,我使用Foo.Name作为键-即对象将根据Name属性的值进行分组。
这里有一个问题-您根据名称将两个对象视为重复对象,但是ID呢?在我的例子中,我只取组中第一个对象的ID。如果你的对象有不同的ID,这可能是一个问题。
xriantvc2#
使用方法链的稍短版本:
mzaanser3#
你也可以使用字典:
v1uwarro4#
其他解决方案使用
GroupBy
。GroupBy
很慢(它保存了内存中的所有元素),所以我写了自己的方法CountBy
:rdrgkggo5#
为什么不写一个新的答案!现在,我想你可以做一些像。。
var duplicatesCount = listVariable.Count(o => o.Equals(listElement));
然后在新列表中添加每个具有duplicateCount的元素,并使用
!listVariable.Contains(elem)
复制阻止器3phpmpom6#
这里是完整的程序,请检查此
kh212irz7#
另一种解决方案