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 不重复计数的主要内容,如果未能解决你的问题,请参考以下文章
不使用 lambda 表达式时的 LINQ 多重排序 [重复]