5

我有一些数据返回如下:

Model { Guid Id }

我有一个 int 的总项目,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) });

并且项目类有 2 个成员:类别的字符串和值的小数。

谢谢!


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

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

和总计数 = 10。

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

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

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

4

3 回答 3

13

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

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 },
};
于 2012-08-27T23:47:18.210 回答
0

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

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

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

于 2012-08-27T23:43:32.220 回答
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”来帮助我们。

于 2014-07-28T05:06:25.090 回答