<address id="ousso"></address>
<form id="ousso"><track id="ousso"><big id="ousso"></big></track></form>
  1. C語言

    c#查詢關鍵字之group子句的使用

    時間:2025-02-24 11:07:54 C語言 我要投稿
    • 相關推薦

    c#查詢關鍵字之group子句的使用

    引導語:C#看起來與Java有著驚人的相似;它包括了諸如單一繼承、接口、與Java幾乎同樣的語法和編譯成中間代碼再運行的過程。以下是小編整理的c#查詢關鍵字之group子句的使用,歡迎參考閱讀!

      group 子句返回一個 IGrouping<(Of <(TKey, TElement>)>) 對象序列,這些對象包含零個或更多個與該組的鍵值匹配的項。例如,可以按照每個字符串中的第一個字母對字符串序列進行分組。在這種情況下,第一個字母是鍵且具有 char 類型,并且存儲在每個 IGrouping<(Of <(TKey, TElement>)>) 對象的 Key 屬性中。編譯器可推斷該鍵的類型。

      可以用 group 子句結束查詢表達式,如下面的示例所示:

      C#  

      // Query variable is an IEnumerable<IGrouping<char, Student>>

      var studentQuery1 =

      from student in students

      group student by student.Last[0];

      如果您想要對每個組執行附加查詢操作,則可以使用 into 上下文關鍵字指定一個臨時標識符。使用 into 時,必須繼續編寫該查詢,并最終用一個 select 語句或另一個 group 子句結束該查詢,如下面的代碼摘錄所示:

      C#  

      // Group students by the first letter of their last name

      // Query variable is an IEnumerable<IGrouping<char, Student>>

      var studentQuery2 =

      from student in students

      group student by student.Last[0] into g

      orderby g.Key

      select g;

      本主題中的“示例”部分中提供了使用含有和不含 into 的 group 的更完整示例。

      枚舉組查詢的結果

      由于 group 查詢產生的 IGrouping<(Of <(TKey, TElement>)>) 對象實質上是列表的列表,因此必須使用嵌套的 foreach 循環來訪問每一組中的各個項。外部循環用于循環訪問組鍵,內部循環用于循環訪問組本身中的每個項。組可能具有鍵,但沒有元素。以下是執行上述代碼示例中的查詢的 foreach 循環:

      C#  

      // Iterate group items with a nested foreach. This IGrouping encapsulates

      // a sequence of Student objects, and a Key of type char.

      // For convenience, var can also be used in the foreach statement.

      foreach (IGrouping<char, Student> studentGroup in studentQuery2)

      {

      Console.WriteLine(studentGroup.Key);

      // Explicit type for student could also be used here.

      foreach (var student in studentGroup)

      {

      Console.WriteLine("   {0}, {1}", student.Last, student.First);

      }

      }

      鍵類型

      組鍵可以是任何類型,如字符串、內置數值類型、用戶定義的命名類型或匿名類型。

      按字符串進行分組

      上述代碼示例使用的是 char。可以很容易地改為指定字符串鍵,如完整的姓氏:

      C#  

      // Same as previous example except we use the entire last name as a key.

      // Query variable is an IEnumerable<IGrouping<string, Student>>

      var studentQuery3 =

      from student in students

      group student by student.Last;

      按布爾進行分組

      下面的示例演示使用布爾值作為鍵將結果劃分成兩個組。請注意,該值是由 group 子句中的子表達式產生的。

      C#  

      class GroupSample1

      {

      // The element type of the data source.

      public class Student

      {

      public string First { get; set; }

      public string Last { get; set; }

      public int ID { get; set; }

      public List<int> Scores;

      }

      public static List<Student> GetStudents()

      {

      // Use a collection initializer to create the data source. Note that each element

      //  in the list contains an inner sequence of scores.

      List<Student> students = new List<Student>

      {

      new Student {First="Svetlana", Last="Omelchenko", ID=111, Scores= new List<int> {97, 72, 81, 60}},

      new Student {First="Claire", Last="O'Donnell", ID=112, Scores= new List<int> {75, 84, 91, 39}},

      new Student {First="Sven", Last="Mortensen", ID=113, Scores= new List<int> {99, 89, 91, 95}},

      new Student {First="Cesar", Last="Garcia", ID=114, Scores= new List<int> {72, 81, 65, 84}},

      new Student {First="Debra", Last="Garcia", ID=115, Scores= new List<int> {97, 89, 85, 82}}

      };

      return students;

      }

      static void Main()

      {

      // Obtain the data source.

      List<Student> students = GetStudents();

      // Group by true or false.

      // Query variable is an IEnumerable<IGrouping<bool, Student>>

      var booleanGroupQuery =

      from student in students

      group student by student.Scores.Average() >= 80; //pass or fail!

      // Execute the query and access items in each group

      foreach (var studentGroup in booleanGroupQuery)

      {

      Console.WriteLine(studentGroup.Key == true ? "High averages" : "Low averages");

      foreach (var student in studentGroup)

      {

      Console.WriteLine("   {0}, {1}:{2}", student.Last, student.First, student.Scores.Average());

      }

      }

      // Keep the console window open in debug mode.

      Console.WriteLine("Press any key to exit.");

      Console.ReadKey();

      }

      }

      /* Output:

      Low averages

      Omelchenko, Svetlana:77.5

      O'Donnell, Claire:72.25

      Garcia, Cesar:75.5

      High averages

      Mortensen, Sven:93.5

      Garcia, Debra:88.25

      */

      按數值范圍進行分組

      下一個示例使用表達式創建表示百分比范圍的數值組鍵。請注意,該示例使用 let 作為方法調用結果的方便存儲位置,從而無需在 group 子句中調用該方法兩次。另請注意,在 group 子句中,為了避免發生“被零除”異常,代碼進行了相應檢查以確保學生的平均成績不為零。有關如何在查詢表達式中安全使用方法的更多信息,請參見如何:在查詢表達式中處理異常(C# 編程指南)。

      C#  

      class GroupSample2

      {

      // The element type of the data source.

      public class Student

      {

      public string First { get; set; }

      public string Last { get; set; }

      public int ID { get; set; }

      public List<int> Scores;

      }

      public static List<Student> GetStudents()

      {

      // Use a collection initializer to create the data source. Note that each element

      //  in the list contains an inner sequence of scores.

      List<Student> students = new List<Student>

      {

      new Student {First="Svetlana", Last="Omelchenko", ID=111, Scores= new List<int> {97, 72, 81, 60}},

      new Student {First="Claire", Last="O'Donnell", ID=112, Scores= new List<int> {75, 84, 91, 39}},

      new Student {First="Sven", Last="Mortensen", ID=113, Scores= new List<int> {99, 89, 91, 95}},

      new Student {First="Cesar", Last="Garcia", ID=114, Scores= new List<int> {72, 81, 65, 84}},

      new Student {First="Debra", Last="Garcia", ID=115, Scores= new List<int> {97, 89, 85, 82}}

      };

      return students;

      }

      // This method groups students into percentile ranges based on their

      // grade average. The Average method returns a double, so to produce a whole

      // number it is necessary to cast to int before dividing by 10.

      static void Main()

      {

      // Obtain the data source.

      List<Student> students = GetStudents();

      // Write the query.

      var studentQuery =

      from student in students

      let avg = (int)student.Scores.Average()

      group student by (avg == 0 ? 0 : avg / 10) into g

      orderby g.Key

      select g;

      // Execute the query.

      foreach (var studentGroup in studentQuery)

      {

      int temp = studentGroup.Key * 10;

      Console.WriteLine("Students with an average between {0} and {1}", temp, temp + 10);

      foreach (var student in studentGroup)

      {

      Console.WriteLine("   {0}, {1}:{2}", student.Last, student.First, student.Scores.Average());

      }

      }

      // Keep the console window open in debug mode.

      Console.WriteLine("Press any key to exit.");

      Console.ReadKey();

      }

      }

      /* Output:

      Students with an average between 70 and 80

      Omelchenko, Svetlana:77.5

      O'Donnell, Claire:72.25

      Garcia, Cesar:75.5

      Students with an average between 80 and 90

      Garcia, Debra:88.25

      Students with an average between 90 and 100

      Mortensen, Sven:93.5

      */

      按復合鍵進行分組

      當您想要按照多個鍵對元素進行分組時,可使用復合鍵。通過使用匿名類型或命名類型來存儲鍵元素,可以創建復合鍵。在下面的示例中,假定已經使用名為 surname 和 city 的兩個成員聲明了類 Person。group 子句使得為每組具有相同姓氏和相同城市的人員創建一個單獨的組。

      復制代碼

      group person by new {name = person.surname, city = person.city};

      如果必須將查詢變量傳遞給其他方法,請使用命名類型。使用自動實現的屬性作為鍵來創建一個特殊類,然后重寫 Equals 和 GetHashCode 方法。還可以使用結構;在此情況下,并不絕對需要重寫這些方法。有關更多信息,請參見如何:使用自動實現的屬性實現輕量類(C# 編程指南)和如何:在目錄樹中查詢重復文件 (LINQ)。后一個主題包含一個代碼示例,該示例演示如何將復合鍵與命名類型結合使用。

      示例

      下面的示例演示在沒有向組應用附加查詢邏輯時將源數據排序放入不同組中的標準模式。這稱為不帶延續的分組。字符串數組中的元素按照它們的第一個字母進行分組。查詢結果是一個 IGrouping<(Of <(TKey, TElement>)>) 類型,其中包含一個 char 類型的公共 Key 屬性以及一個包含分組中每個項的 IEnumerable<(Of <(T>)>) 集合。

      group 子句的結果是序列的序列。因此,若要訪問所返回的每個組中的單個元素,請在循環訪問組鍵的循環內使用嵌套的 foreach 循環,如下面的示例所示。

      C#  

      class GroupExample1

      {

      static void Main()

      {

      // Create a data source.

      string[] words = { "blueberry", "chimpanzee", "abacus", "banana", "apple", "cheese" };

      // Create the query.

      var wordGroups =

      from w in words

      group w by w[0];

      // Execute the query.

      foreach (var wordGroup in wordGroups)

      {

      Console.WriteLine("Words that start with the letter '{0}':", wordGroup.Key);

      foreach (var word in wordGroup)

      {

      Console.WriteLine(word);

      }

      }

      // Keep the console window open in debug mode

      Console.WriteLine("Press any key to exit.");

      Console.ReadKey();

      }

      }

      /* Output:

      Words that start with the letter 'b':

      blueberry

      banana

      Words that start with the letter 'c':

      chimpanzee

      cheese

      Words that start with the letter 'a':

      abacus

      apple

      */

      此示例演示在創建組之后,如何使用通過 into 實現的延續對這些組執行附加邏輯。有關更多信息,請參見 into(C# 參考)。下面的示例查詢每個組以僅選擇那些鍵值為元音的元素。

      C#  

      class GroupClauseExample2

      {

      static void Main()

      {

      // Create the data source.

      string[] words2 = { "blueberry", "chimpanzee", "abacus", "banana", "apple", "cheese", "elephant", "umbrella", "anteater" };

      // Create the query.

      var wordGroups2 =

      from w in words2

      group w by w[0] into grps

      where (grps.Key == 'a' || grps.Key == 'e' || grps.Key == 'i'

      || grps.Key == 'o' || grps.Key == 'u')

      select grps;

      // Execute the query.

      foreach (var wordGroup in wordGroups2)

      {

      Console.WriteLine("Groups that start with a vowel: {0}", wordGroup.Key);

      foreach (var word in wordGroup)

      {

      Console.WriteLine("   {0}", word);

      }

      }

      // Keep the console window open in debug mode

      Console.WriteLine("Press any key to exit.");

      Console.ReadKey();

      }

      }

      /* Output:

      Groups that start with a vowel: a

      abacus

      apple

      anteater

      Groups that start with a vowel: e

      elephant

      Groups that start with a vowel: u

      umbrella

      */

      備注

      編譯時,group 子句被轉換為對 GroupBy 方法的調用。


    【c#查詢關鍵字之group子句的使用】相關文章:

    c#查詢關鍵字之into的使用07-25

    c#關鍵字查詢之select 子句運用10-06

    c#查詢關鍵字之join 子句運用方法07-01

    c#查詢關鍵字from 子句的用法11-07

    c#查詢關鍵字where 子句的運用10-31

    c#運算符關鍵字is的使用10-30

    java的import關鍵字的使用08-17

    c#中預處理指令#if的使用08-18

    c#檢測cpu使用率09-01

    <address id="ousso"></address>
    <form id="ousso"><track id="ousso"><big id="ousso"></big></track></form>
    1. 日日做夜狠狠爱欧美黑人