我想了解System.Linq.Lookup
類。當調用GetType()
,顯示以下內容:爲什麼沒有從GroupBy得到的查找具有查找屬性?
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
屬於反勾號而不是+
。加號表示我們正在訪問嵌套在另一個類中的類。在這種情況下,這意味着我們正在訪問嵌套在Lookup
類中的Grouping
類。- 什麼是
Grouping
類後面的2+
?這是嵌套在Lookup
內的類。 - 此外,在小提琴的
Inspect()
方法,爲什麼lookup
有Key
屬性,而不是一個Count
和Item
財產?lookup
擁有Key
屬性,因爲它不是Lookup
;它是嵌套在Lookup
內的Grouping
。
一個類被定義在另一個類裏面是什麼意思?這是否意味着它是一個公共類,它在另一個類中定義了它?父類的行爲是否像一個名字空間? –
在類的內部,您可以定義另一個類。在同一個空間中,你可以聲明一個方法或屬性,你也可以聲明另一個類型。這隻能做到一個層次,所以你不能有一個嵌套在另一個嵌套在第三個類中的類中的類。在C#中,引用類的語法與其他名稱空間沒有什麼不同,但在CLR中,它以不同的方式指定(即「+」字符)。 –
看着你的小提琴,回答爲什麼你需要'使用'語句來編譯代碼的問題,這是因爲你正在使用擴展方法。爲了使用擴展方法,保存定義擴展方法的類型的名稱空間必須使用'using'語句「導入」。這同樣是因爲如果你刪除'使用System.Linq',很多方法不再可用於你的集合(例如'Count()','Select()',Where()'等。 )。 –