我想了解System.Linq.Lookup
课程。致电GetType()
时,会显示以下内容:
System.Linq.Lookup`2+Grouping[System.Object,System.Data.DataRow]
2+
是什么意思?Grouping
之后的2+
课程是什么?Inspect()
方法中,为什么lookup
具有Key
属性而不是Count
和Item
属性?最终目标是学习如何将其绑定到嵌套的ASP.NET转发器。我们已经成功将结果转换为Dictionary<string, DataTable>
。但是,我们怀疑,一旦我们了解了它的结构,就可以将目录绑定到GroupedEnumerable
。
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
属性而不是Count
和Item
属性?< / strong> lookup
具有Key
属性,因为它不是Lookup
;它是嵌套在Grouping
内的Lookup
。答案 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
。