2015-05-04 48 views
2

我想了解System.Linq.Lookup類。當調用GetType(),顯示以下內容:爲什麼沒有從GroupBy得到的查找具有查找屬性?

System.Linq.Lookup`2+Grouping[System.Object,System.Data.DataRow] 
  • 什麼是反勾號是什麼意思?
  • 2+是什麼意思?
  • 什麼是Grouping類跟在2+之後?
  • 此外,在小提琴的Inspect()方法,爲什麼lookupKey屬性,而不是一個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屬於反勾號而不是+。加號表示我們正在訪問嵌套在另一個類中的類。在這種情況下,這意味着我們正在訪問嵌套在Lookup類中的Grouping類。
  • 什麼是Grouping類後面的2+這是嵌套在Lookup內的類。
  • 此外,在小提琴的Inspect()方法,爲什麼lookupKey屬性,而不是一個CountItem財產?lookup擁有Key屬性,因爲它不是Lookup;它是嵌套在Lookup內的Grouping

回答

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類中定義的類名爲Grouping

這兩種類型的方括號中的是兩種類型的通用(System.Linq.Lookup)關閉結束。

於是完整的類型,用C#編寫如下:

System.Linq.Lookup<object, System.Data.DataRow>.Grouping 

,因爲它實現IEnumerable,這意味着本身可以遍歷(就像任何類型的類型並不需要一個Items財產其他IEnumerableList<T>)。

並非所有列表/收藏有Count性質,沒有什麼東西是說,他們不得不這樣做。您可以通過調用Count()擴展方法來獲得計數,但這可能會導致整個枚舉被迭代,這可能會或可能不會有顯着的性能成本。

+0

一個類被定義在另一個類裏面是什麼意思?這是否意味着它是一個公共類,它在另一個類中定義了它?父類的行爲是否像一個名字空間? –

+1

在類的內部,您可以定義另一個類。在同一個空間中,你可以聲明一個方法或屬性,你也可以聲明另一個類型。這隻能做到一個層次,所以你不能有一個嵌套在另一個嵌套在第三個類中的類中的類。在C#中,引用類的語法與其他名稱空間沒有什麼不同,但在CLR中,它以不同的方式指定(即「+」字符)。 –

+0

看着你的小提琴,回答爲什麼你需要'使用'語句來編譯代碼的問題,這是因爲你正在使用擴展方法。爲了使用擴展方法,保存定義擴展方法的類型的名稱空間必須使用'using'語句「導入」。這同樣是因爲如果你刪除'使用System.Linq',很多方法不再可用於你的集合(例如'Count()','Select()',Where()'等。 )。 –

2

這是CLR標準類型語法。

  • `2表示該類型有兩個通用參數。
  • +表示嵌套在另一種類型內的類型。

在這種情況下,它告訴你,Grouping class嵌套在Lookup類中有兩個通用的參數。

source可以看出,它定義的唯一公共財產是Key

+0

如果我們調用到'lookup',爲什麼我們到達'Grouping'而不是'lookup'?在我看來,如果我們調用'lookup.FirstOrDefault()。Key',我們應該只進入'Grouping'。 –

+0

啊哈。我知道了。父'Lookup'類有點像名稱空間。實際的類型是「分組」。它恰好將其定義嵌套在「Lookup」中。這是有道理的。我被拋棄認爲這種類型是一個「查找」,而它真的是一個「分組」。 –

+1

是的;這只是一個嵌套類。請注意,它從外部類繼承它的泛型類型參數。 – SLaks