Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用LINQ按组列出的前三名文档_C#_Linq - Fatal编程技术网

C# 使用LINQ按组列出的前三名文档

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

我试图实现的是AccessGroup列出的前3个文档。我所说的前三名是指数量最多的文档。我当前的解决方案返回:


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