C# Linq不同计数
我返回了一些数据,如下所示:C# Linq不同计数,c#,linq,C#,Linq,我返回了一些数据,如下所示: Model { Guid Id } 我有一个总项目的整数,inttotalcount 我试图从作为类别1返回的数据中获取不同的计数, 并将总项目减去类别1中的计数,即为类别2 我有以下linq来获取类别1的不同计数,但是如何将类别2的计数添加到IEnumerable中 var result = data. GroupBy(x => x.Id). Select(x => new { Category = "1", Value = x.Se
Model { Guid Id }
我有一个总项目的整数,inttotalcount
我试图从作为类别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类有两个成员:string代表类别,decimal代表值
谢谢
编辑: 因此,我有以下数据
IEnumerable data
,其中包含以下数据:
{ Id: 1 }
{ Id: 2 }
{ Id: 2 }
{ Id: 1 }
{ Id: 3 }
{ Id: 4 }
和totalCount=10
我想从数据中获得Id的不同计数,在本例中为4,作为类别1,totalCount-distinct项作为类别2。因此,对于结果,我将有一个Item
的IEnumerable
,以具有以下内容:
{ Category: "1", Value: 4 }, { Category: "2", Value: 6 }
现在,我的linq语句只返回
{Category:“1”,Value:4}
,我不知道下一步该怎么办。一天结束时需要两个对象,还是只能作为一个返回的一部分?你可以这样做:
var result = data.
GroupBy(x => x.Id).
Select(x => new {
DistinctCount = x.Select(v => v.Id).Distinct().Count(),
TotalCount = data.Count()
});
这个或类似的方法可能会奏效。你的问题不是很清楚,但我认为这就是你想要的:
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 },
};
inttotalcount=data.Count();
int distinctCount=data.Select(x=>x.Id).Distinct().Count();
列表结果=新列表
{
新项(){Category=“1”,Value=distinctCount},
新项(){Category=“2”,Value=totalCount-distinctCount},
};
我使用数据结构来面对这种情况
Dictionary< string, List< YOUR_TYPE >> dictionary = new Dictionary<string, List< YOUR_TYPE >> ();
就像SQL:“选择与数据源不同的密钥名”
foreach(变量键入键){
var list=新列表<您的类型>();
list.AddRange(dataSource.Where(x=>x.YOUR_Filter_Property==YOUR_KEY_NAME).ToList());
添加(键、列表);
}
然后我们可以使用字典的默认功能,如“ContainKey”、“Keys”来帮助我们。我不太理解这个问题。一些简单的示例数据可能会有所帮助。在代码中,Count()方法将始终返回1。您处于按“.Id”分组的项目上下文中。因此,每个组将只有一个不同的.Id。如果您按x.Category==“1”分组,我怀疑您的问题会得到解决。这将给你一个“假”组和一个“真”组,你可以分别区分它们。谢谢!我刚刚用一些样本数据编辑了原始问题。希望有帮助。谢谢!因为我对LINQ还不太熟悉,所以我把问题复杂化了。我试着只用一个LINQ语句就可以做到这一点,但我绝对可以这样做。
var keys = YOUR_DATA_SOURCE.Select(item => item.YOUR_KEY_NAME ).Distinct();
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);
}