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,我返回了一些数据,如下所示: 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);
}