c# - 如何使用 IEnumerable.GroupBy<T> 和 3 个不同的 "qualities"在 C# LINQ 中获取计数?

标签 c# linq collections grouping generic-collections

我想按从抽象类继承的对象列表进行分组:

  1. 列表中项目的类型(在此示例中为 MyAction 或 MyObservation)
  2. 整数属性 ClassId
  3. 字符串属性值

并计算出这些组的数量。

public abstract class MyData
{
    public int ClassId;
    public string Value;
    //...
}

public class MyAction : MyData
{
    //...
}

public class MyObservation : MyData
{
    //...
}

// in some class...
IEnumerable<MyData> _myDatas;

void TryGroupBy()
{
    var result = _myDatas.GroupBy(
               data => KeySelector(data), /* ?? key is 3 pieces of info */,
               data => ElementSelector/* ?? I didn't get this either */,
               (row, rows) => new 
               {
                   ClassId = ?? /*how to get it from 3 piece key */
                   TypeOfObject = /* how to get it ?? */
                   Value = /* how to get it ?? */
                   Count = rows.Count
               }));

最佳答案

您可以使用匿名类型作为键,然后使用 Key 属性(例如 group.Key.Id)访问属性,也可以使用 this overload这将为您提供作为结果选择器的第一个参数的键:

_myDatas.GroupBy(
           data => new { Type = data.GetType(), Id = data.ClassId, Value = data.Value },
           (key, rows) => new 
           {
               ClassId = key.Id,
               TypeOfObject = key.Type,
               Value = key.Value,
               Count = rows.Count()
           }));

关于c# - 如何使用 IEnumerable.GroupBy<T> 和 3 个不同的 "qualities"在 C# LINQ 中获取计数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28767812/

相关文章:

c# - 使用 LINQ 创建 XML

java - 带有字符串对象的简单集合,允许以 0(1) 操作进行搜索

java - 从一对多集合中删除元素(Java + HIbernate + Struts)

c# - 在 IIS 中访问 .svc 文件时出现 HTTP 404

c# - 如何使用 linq to entities 读取 UTF 8 编码的字符串

c# - XML Writer 将结果存储到字符串

c# - Linq确定一个值是否出现超过x次

c# - ICollection<T> 是非基于索引的,但 TakeWhile() 存在

c# - 如何使用 ASP.NET Identity 创建用户并获取新创建的 ID

c# - 我用vs2010开发的程序是否有不同电脑连接本地数据库的通用连接串