Linq 不重复计数

Posted

技术标签:

【中文标题】Linq 不重复计数【英文标题】:Linq distinct count 【发布时间】:2012-08-22 10:50:11 【问题描述】:

我有一些数据返回如下:

Model  Guid Id 

我有一个整数,int totalCount

我正在尝试从作为类别 1 返回的数据中获取不同的计数, 并将总项目减去类别 1 的计数为类别 2。

我有以下 linq 来获取类别 1 的不同计数,但是如何将类别 2 的计数添加到 IEnumerable 中?

var result = data.
    GroupBy(x => x.Id).
    Select(x => new  Category = "1", Value = x.Select(v => v.Id).Distinct().Count() ).
    GroupBy(x => x.Category).
    Select(x => new Item  Category = x.Key, Value = x.Sum(y => y.Value) );

Item Class 有 2 个成员:string 代表 Category,decimal 代表 Value。

谢谢!


编辑: 所以我有以下数据IEnumerable<Model> data,它包含以下数据:

 Id: 1 
 Id: 2 
 Id: 2 
 Id: 1 
 Id: 3 
 Id: 4 

并且 totalCount = 10。

我想从数据中获取 Id 的不同计数,在这种情况下为 4,作为类别 1,totalCount - 不同的项目是类别 2。所以对于结果,我将有一个 IEnumerable 987654327@有以下内容:

 Category: "1", Value: 4 ,  Category: "2", Value: 6 

目前我的 linq 语句只返回 Category: "1", Value: 4 ,我不知道下一步该做什么。

【问题讨论】:

我不太明白这个问题。一些简单的样本数据可能会有所帮助。在您的代码中,Count() 方法将始终返回 1。您处于按“.Id”分组的项目的上下文中。因此,每组只有一个不同的 .Id。我怀疑如果您按 x.Category=="1" 分组,您的问题会得到解决。这会给你一个“假”组和一个“真”组,你可以分别区分一个。 谢谢!我刚刚用一些示例数据编辑了原始问题。希望对您有所帮助。 【参考方案1】:

我用数据结构来面对情况。

Dictionary< string, List< YOUR_TYPE >> dictionary = new Dictionary<string, List< YOUR_TYPE >> ();

我们可以从源获得不同的密钥。

var keys = YOUR_DATA_SOURCE.Select(item => item.YOUR_KEY_NAME ).Distinct();

就像 SQL 一样:“SELECT DISTINCT YOUR_KEY_NAME FROM YOUR_DATA_SOURCE”。

foreach (var key in keys) 
    var list = new List< YOUR_TYPE > ();
    list.AddRange (dataSource.Where (x => x.YOUR_Filter_Property == YOUR_KEY_NAME ).ToList ());

    dictionary.Add (key, list);

然后我们可以使用 Dictionary 的默认功能,例如“ContainKey”、“Keys”来帮助我们。

【讨论】:

【参考方案2】:

你的问题不是很清楚,但我认为这是你想要的:

int totalCount = data.Count();
int distinctCount = data.Select(x => x.Id).Distinct().Count();
List<Item> result = new List<Item>

    new Item()  Category = "1", Value = distinctCount ,
    new Item()  Category = "2", Value = totalCount - distinctCount ,
;

【讨论】:

谢谢!因为我对 LINQ 还很陌生,所以我把问题复杂化了。我试图只用一个 LINQ 语句来做到这一点,但我绝对可以这样做。【参考方案3】:

您在一天结束时需要两件物品,还是只是一次退货的一部分?你可以这样做:

var result = data.
    GroupBy(x => x.Id).
    Select(x => new  
       DistinctCount = x.Select(v => v.Id).Distinct().Count(),
       TotalCount = data.Count()
    );

这个或类似的东西可能会起作用。

【讨论】:

以上是关于Linq 不重复计数的主要内容,如果未能解决你的问题,请参考以下文章

使用 LINQ 选择单个列表的所有唯一组合,不重复

使用 LINQ 选择单个列表的所有唯一组合,不重复

mysql 计数器 计算不重复

不使用 lambda 表达式时的 LINQ 多重排序 [重复]

将 .ToArray() 放入 from/in [重复] 时,LINQ 查询性能不佳

错误列计数不计算第 1 行的计数 [重复]