为什么GroupBy产生的Lookup没有Lookup属性?

时间:2015-05-04 17:50:10

标签: c# linq

我想了解System.Linq.Lookup课程。致电GetType()时,会显示以下内容:

System.Linq.Lookup`2+Grouping[System.Object,System.Data.DataRow]
  • 背蜱是什么意思?
  • 2+是什么意思?
  • Grouping之后的2+课程是什么?
  • 此外,在Fiddle的Inspect()方法中,为什么lookup具有Key属性而不是CountItem属性?

最终目标是学习如何将其绑定到嵌套的ASP.NET转发器。我们已经成功将结果转换为Dictionary<string, DataTable>。但是,我们怀疑,一旦我们了解了它的结构,就可以将目录绑定到GroupedEnumerable

Fiddle

public static class Program
{
    public static void Main()
    {
        var dt = GetData();
        var enumerable = dt.AsEnumerable();
        var grouped = enumerable.GroupBy(dr => dr["Name"]);
        Inspect(grouped);
    }

    public static void Inspect(IEnumerable<IGrouping<object, DataRow>> grouped)
    {
        LogType("grouped", grouped);

        var lookup = grouped.FirstOrDefault();
        LogType("lookup", lookup);
        LogType("key", lookup.Key);

        var item = lookup.FirstOrDefault();
        LogType("item", item);
    }

    public static void LogType(string label, object v)
    {
        Console.WriteLine("\n" + label.PadRight(10) + v.GetType());
    }

    public static DataTable GetData()
    {
        DataTable dt = new DataTable();
        dt.Columns.Add("Name");
        dt.Columns.Add("StartDate");
        dt.Columns.Add("EndDate");
        for(var i = 0; i < 10; ++i)
        {
            var row = dt.NewRow();
            row["Name"] = i % 2;
            row["StartDate"] = DateTime.Now;
            row["EndDate"] = DateTime.Now;
            dt.Rows.Add(row);
        }
        return dt;
    }
}

输出

grouped   System.Linq.GroupedEnumerable`3[System.Data.DataRow,System.Object,System.Data.DataRow]

lookup    System.Linq.Lookup`2+Grouping[System.Object,System.Data.DataRow]

key       System.String

item      System.Data.DataRow

修改

Forked Fiddle,用于检索GroupedEnumerable

中的值

用我自己的话回答:

  • 后退标记是什么意思?后面的刻度表示一个类所占的类型参数的数量。在这种情况下,它表示Lookup类有两个类型参数。
  • 2+的含义是什么? 2属于后方,而不属于+。加号意味着我们正在访问嵌套在另一个类中的类。在这种情况下,这意味着我们正在访问嵌套在Grouping类中的Lookup类。
  • Grouping之后的2+类是什么?这是一个嵌套在Lookup中的类。
  • 此外,在小提琴的Inspect()方法中,为什么lookup具有Key属性而不是CountItem属性?< / strong> lookup具有Key属性,因为它不是Lookup;它是嵌套在Grouping内的Lookup

2 个答案:

答案 0 :(得分:3)

System.Linq.Lookup`2+Grouping[System.Object,System.Data.DataRow]

System.Linq.Lookup`2在C#中表示为System.Linq.Lookup<T,U>(后面的刻度表示该类是通用的,数字是通用参数的数量)。

+Grouping表示在名为System.Linq.Lookup`2的{​​{1}}类中定义了一个类。

方括号内的两种类型是泛型(Grouping)关闭的两种类型。

所以用C#编写的完整类型如下所示:

System.Linq.Lookup

该类型不需要System.Linq.Lookup<object, System.Data.DataRow>.Grouping 属性,因为它实现了Items,这意味着类型本身可以被迭代(就像任何其他IEnumerable一样,例如IEnumerable })。

并非所有列表/集合都具有List<T>属性,没有任何内容表明他们必须这样做。您可以通过调用Count扩展方法来获取计数,但这可能导致整个可枚举被迭代,这可能会或可能不会产生显着的性能成本。

答案 1 :(得分:2)

这是CLR标准类型语法。

  • `2表示该类型有两个通用参数。
  • +表示嵌套在另一种类型中的类型。

在这种情况下,它告诉您Grouping class嵌套在Lookup类中,并带有两个通用参数。

source可以看出,它定义的唯一公共属性是Key