C# 使用LINQ按组列出的前三名文档
我试图实现的是AccessGroup列出的前3个文档。我所说的前三名是指数量最多的文档。我当前的解决方案返回:C# 使用LINQ按组列出的前三名文档,c#,linq,C#,Linq,我试图实现的是AccessGroup列出的前3个文档。我所说的前三名是指数量最多的文档。我当前的解决方案返回: DocumentId访问组ID计数 2 1 5 1 1 3 3 1 2 5 1 2 4 1 1 6
DocumentId访问组ID计数
2 1 5
1 1 3
3 1 2
5 1 2
4 1 1
6 1 1
8 1 1
10 1 1
... 2.
我的目标是:
DocumentId访问组ID计数
2 1 5
1 1 3
3 1 2
... 2.
我制作了一个可运行的LINQPad程序:
void Main()
{
var sampleData=新列表();
Add(newfoo{DocumentId=1,AccessGroupId=1});
Add(newfoo{DocumentId=2,AccessGroupId=1});
Add(newfoo{DocumentId=3,AccessGroupId=1});
Add(newfoo{DocumentId=2,AccessGroupId=1});
Add(newfoo{DocumentId=2,AccessGroupId=1});
Add(newfoo{DocumentId=2,AccessGroupId=1});
Add(newfoo{DocumentId=3,AccessGroupId=1});
Add(newfoo{DocumentId=2,AccessGroupId=1});
Add(newfoo{DocumentId=1,AccessGroupId=1});
Add(newfoo{DocumentId=1,AccessGroupId=1});
Add(newfoo{DocumentId=4,AccessGroupId=1});
Add(newfoo{DocumentId=5,AccessGroupId=1});
Add(newfoo{DocumentId=6,AccessGroupId=1});
Add(newfoo{DocumentId=5,AccessGroupId=1});
Add(newfoo{DocumentId=8,AccessGroupId=1});
Add(newfoo{DocumentId=10,AccessGroupId=1});
Add(newfoo{DocumentId=2,AccessGroupId=2});
Add(newfoo{DocumentId=2,AccessGroupId=2});
Add(newfoo{DocumentId=2,AccessGroupId=2});
Add(newfoo{DocumentId=3,AccessGroupId=2});
Add(newfoo{DocumentId=3,AccessGroupId=2});
Add(newfoo{DocumentId=3,AccessGroupId=2});
Add(newfoo{DocumentId=3,AccessGroupId=2});
Add(newfoo{DocumentId=3,AccessGroupId=2});
Add(newfoo{DocumentId=3,AccessGroupId=2});
Add(newfoo{DocumentId=3,AccessGroupId=2});
Add(newfoo{DocumentId=3,AccessGroupId=2});
Add(newfoo{DocumentId=4,AccessGroupId=2});
Add(newfoo{DocumentId=4,AccessGroupId=2});
Add(newfoo{DocumentId=4,AccessGroupId=2});
Add(newfoo{DocumentId=4,AccessGroupId=2});
Add(newfoo{DocumentId=4,AccessGroupId=2});
变量x=(来自sampleData中的条目
将新的{entry.DocumentId,entry.AccessGroupId}分组到g中
orderby g.Key.AccessGroupId,g.Count()降序
选择新{DocumentId=g.Key.DocumentId,AccessGroupId=g.Key.AccessGroupId,Count=g.Count()}
);
控制台写入线(x);
}
公开课Foo{
public int DocumentId{get;set;}
public int AccessGroupId{get;set;}
}
感谢您的帮助 如下更改您的linq
var x = (from entry in sampleData
group entry by new { entry.DocumentId, entry.AccessGroupId } into g
orderby g.Count() descending
select new { DocumentId = g.Key.DocumentId, AccessGroupId = g.Key.AccessGroupId, Count = g.Count() }
).Take(3);
Take(3)将选择前三名,希望有帮助。如下更改您的linq
var x = (from entry in sampleData
group entry by new { entry.DocumentId, entry.AccessGroupId } into g
orderby g.Count() descending
select new { DocumentId = g.Key.DocumentId, AccessGroupId = g.Key.AccessGroupId, Count = g.Count() }
).Take(3);
Take(3)将选择前3个条目,希望对您有所帮助。使用Linq
如果您正在处理一个特别大的数据集,您可能会选择在linq之外执行
sampleData
.GroupBy(a=>new{a.AccessGroupId,a.DocumentId})
.Select(a=>new{ Count=a.Count(),a.Key.AccessGroupId,a.Key.DocumentId })
.OrderByDescending(a=>a.Count)
.GroupBy(a=>a.AccessGroupId)
.Select(a=>new{ AccessGroupId = a.Key, Values = a.Take(3)});
如果您想查看,请查看工作表
使用字典
非常确定这是一种更有效的方法,使用字典
来存储计数
var cache = new Dictionary<int,Dictionary<int,int>>();
foreach(var item in sampleData)
{
if(!cache.ContainsKey(item.AccessGroupId))
{
cache[item.AccessGroupId] = new Dictionary<int,int>();
}
if(!cache[item.AccessGroupId].ContainsKey(item.DocumentId))
{
cache[item.AccessGroupId][item.DocumentId]=0;
}
cache[item.AccessGroupId][item.DocumentId]++;
}
var results = cache
.Select(a=>new{
AccessGroupId = a.Key,
Values = a.Value.OrderByDescending(b=>b.Value)
.Select(b=>new{ DocumentId = b.Key, Count = b.Value })
.Take(3)
});
var cache=newdictionary();
foreach(sampleData中的变量项)
{
如果(!cache.ContainsKey(item.AccessGroupId))
{
cache[item.AccessGroupId]=new Dictionary();
}
如果(!cache[item.AccessGroupId].ContainsKey(item.DocumentId))
{
缓存[item.AccessGroupId][item.DocumentId]=0;
}
缓存[item.AccessGroupId][item.DocumentId]++;
}
var results=cache
.Select(a=>new{
AccessGroupId=a.键,
Values=a.Value.OrderByDescending(b=>b.Value)
.Select(b=>new{DocumentId=b.Key,Count=b.Value})
.采取(3)
});
用户友好程度较低,但与使用GroupBy相比,它的成本相对较低,除非您正在使用Linq,否则如果您想使用Linq检查它,下面是
如果您正在处理一个特别大的数据集,您可能会选择在linq之外执行
sampleData
.GroupBy(a=>new{a.AccessGroupId,a.DocumentId})
.Select(a=>new{ Count=a.Count(),a.Key.AccessGroupId,a.Key.DocumentId })
.OrderByDescending(a=>a.Count)
.GroupBy(a=>a.AccessGroupId)
.Select(a=>new{ AccessGroupId = a.Key, Values = a.Take(3)});
如果您想查看,请查看工作表
使用字典
非常确定这是一种更有效的方法,使用字典
来存储计数
var cache = new Dictionary<int,Dictionary<int,int>>();
foreach(var item in sampleData)
{
if(!cache.ContainsKey(item.AccessGroupId))
{
cache[item.AccessGroupId] = new Dictionary<int,int>();
}
if(!cache[item.AccessGroupId].ContainsKey(item.DocumentId))
{
cache[item.AccessGroupId][item.DocumentId]=0;
}
cache[item.AccessGroupId][item.DocumentId]++;
}
var results = cache
.Select(a=>new{
AccessGroupId = a.Key,
Values = a.Value.OrderByDescending(b=>b.Value)
.Select(b=>new{ DocumentId = b.Key, Count = b.Value })
.Take(3)
});
var cache=newdictionary();
foreach(sampleData中的变量项)
{
如果(!cache.ContainsKey(item.AccessGroupId))
{
cache[item.AccessGroupId]=new Dictionary();
}
如果(!cache[item.AccessGroupId].ContainsKey(item.DocumentId))
{
缓存[item.AccessGroupId][item.DocumentId]=0;
}
缓存[item.AccessGroupId][item.DocumentId]++;
}
var results=cache
.Select(a=>new{
AccessGroupId=a.键,
Values=a.Value.OrderByDescending(b=>b.Value)
.Select(b=>new{DocumentId=b.Key,Count=b.Value})
.采取(3)
});
她说,用户友好程度较低,但与使用GroupBy相比,它肯定更便宜,除非您使用的是Linq