2012-08-27 39 views
1

我返回后续的一些数据:LINQ的重复计数

Model { Guid Id } 

和我的全部项目,int totalCount的一个int。

我想从数据重复计数被返回第1类, 而拥有项目总减去1类计为2类。

我有以下的LINQ to获取第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类有2个成员:类别为字符串,值为小数。

谢谢!


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

{ Id: 1 } 
{ Id: 2 } 
{ Id: 2 } 
{ Id: 1 } 
{ Id: 3 } 
{ Id: 4 } 

和TOTALCOUNT = 10

我想获得的重复计数从数据中获得的Id(在这种情况下为4)作为类别1,而totalCount - 不同的项目为类别2.因此,对于结果,我将有IEnumerableItem具有以下内容:

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

现在我的linq语句只返回{ Category: "1", Value: 4 },我不知道下一步该怎么做。

+0

我不太明白这个问题。一些简单的示例数据可能会有帮助在您的代码中,Count()方法将始终返回1.您处于按“.Id”分组的项目的上下文中。因此,每组只有一个不同的.Id。 我怀疑你的问题将被解决,如果你按x.Category ==“1”分组。这会给你一个“假”组和一个“真”组,你可以分别区分一个。 – Tormod

+0

谢谢!我只是用一些示例数据编辑了原始问题。希望能帮助到你。 – user1628865

回答

5

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

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 }, 
}; 
+0

谢谢!由于我对LINQ相当陌生,所以我将这个问题过度复杂化了。我只是试着用一条LINQ声明来做,但我绝对可以这样做。 – user1628865

0

你在一天结束时是否需要两个物体,还是只能是一个回归的一部分?你可以这样做:

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

这或类似的东西可能会奏效。

0

我使用的数据结构要面对的情况。

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”来帮助我们。