рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд▓рд┐рдП рд▓рд╛рдЗрдирдХ рдХреА рд╕рд░рд▓ рдпрд╛ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдореБрд╢реНрдХрд┐рд▓ рд╣реИ

LINQ to рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдиреЗ рдЕрдм рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╣рдорд╛рд░реЗ рдЬреАрд╡рди рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдХрд░ рд▓рд┐рдпрд╛ рд╣реИ, рдиреЗрдЯ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рдкреВрд░реЗ рдвреЗрд░ рдореЗрдВ рд╡рд┐рдЬрдпреА рд░реВрдк рд╕реЗ рдШреВрдо рд░рд╣рд╛ рд╣реИред рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рдореИрдВ рдХрдИ рд╕реНрдкрд╖реНрдЯ рдЪреАрдЬреЛрдВ рдХрд╛ рдЙрджрд╛рд╣рд░рдг рджреЗрдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ рдЬрд┐рдиреНрд╣реЗрдВ рдореБрдЭреЗ LINQ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╕рдордп рдирд┐рдкрдЯрдирд╛ рдерд╛ред рджрд┐рд▓рдЪрд╕реНрдк - рдХреГрдкрдпрд╛, рдмрд┐рд▓реНрд▓реА рдХреЗ рдиреАрдЪреЗред

1. рд╕реВрдЪреА <рдЯреА> рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреА рд╕реБрд╡рд┐рдзрд╛


LINQ рдЗрд╕рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рднрд┐рдиреНрди рд╣реИ рдЬрдм IEnumerable <T> рдкреНрд░рдХрд╛рд░ рдХреА рдХреЛрдИ рд╡рд╕реНрддреБ рдЙрд╕ рдкрд░ рдЖрддреА рд╣реИ рдФрд░ рдЬрдм рд╕реВрдЪреА <T> рдЖрддреА рд╣реИред рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рд╕рд░рд▓ рдЬрд╣рд╛рдВ рд╡рд┐рдзрд┐ рдЕрд▓рдЧ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рдмрдирд╛рддрд╛ рд╣реИ:
if (source is Iterator<TSource>) return ((Iterator<TSource>)source).Where(predicate); if (source is TSource[]) return new WhereArrayIterator<TSource>((TSource[])source, predicate); if (source is List <TSource>) return new WhereListIterator<TSource>(( List <TSource>)source, predicate); * This source code was highlighted with Source Code Highlighter .
  1. if (source is Iterator<TSource>) return ((Iterator<TSource>)source).Where(predicate); if (source is TSource[]) return new WhereArrayIterator<TSource>((TSource[])source, predicate); if (source is List <TSource>) return new WhereListIterator<TSource>(( List <TSource>)source, predicate); * This source code was highlighted with Source Code Highlighter .
  2. if (source is Iterator<TSource>) return ((Iterator<TSource>)source).Where(predicate); if (source is TSource[]) return new WhereArrayIterator<TSource>((TSource[])source, predicate); if (source is List <TSource>) return new WhereListIterator<TSource>(( List <TSource>)source, predicate); * This source code was highlighted with Source Code Highlighter .
  3. if (source is Iterator<TSource>) return ((Iterator<TSource>)source).Where(predicate); if (source is TSource[]) return new WhereArrayIterator<TSource>((TSource[])source, predicate); if (source is List <TSource>) return new WhereListIterator<TSource>(( List <TSource>)source, predicate); * This source code was highlighted with Source Code Highlighter .
if (source is Iterator<TSource>) return ((Iterator<TSource>)source).Where(predicate); if (source is TSource[]) return new WhereArrayIterator<TSource>((TSource[])source, predicate); if (source is List <TSource>) return new WhereListIterator<TSource>(( List <TSource>)source, predicate); * This source code was highlighted with Source Code Highlighter .

рд╡реИрд╕реЗ, рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╕рд░рдгреА рдХрд╛ рдЕрдкрдирд╛ рдЗрдЯреНрд░реЗрдЯрд░ рднреА рд╣реЛрдЧрд╛, рдЗрд╕рдХрд╛ рдЕрдВрддрд░ рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рддрддреНрд╡реЛрдВ рдХреЛ рд╕реАрдзреЗ рдПрдХ рдЗрдВрдбреЗрдХреНрд╕ рдХреЙрд▓ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдЧрд╛ред

рдпрд╣ рд╕реБрд╡рд┐рдзрд╛ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдХреНрдпрд╛ рджрд┐рд▓рдЪрд╕реНрдк рдмрдирд╛рддреА рд╣реИ? рдареАрдХ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдореИрдВ рдЖрдорддреМрд░ рдкрд░ рдЕрдВрддрд┐рдо рдирд┐рд░реНрдорд╛рдг рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЙрд▓рдЭрди рдореЗрдВ рдерд╛, рдХреНрдпреЛрдВрдХрд┐ рд╡рд┐рдЪрд╛рд░ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдпрд╣ рдкреВрд░реЗ рдЧрдгрдирд╛рдХрд░реНрддрд╛ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЕрдВрдд рддрдХ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрджрд┐ рдЖрдк рдЗрд╕реЗ рдЙрд╕ рд╡рд╕реНрддреБ рдкрд░ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ IList <T> рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдЕрдВрддрд┐рдо рддрддреНрд╡ рдЗрдВрдбреЗрдХреНрд╕рд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдЬреЛ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЗрддрдирд╛ рдмреБрд░рд╛ рдирд╣реАрдВ рд╣реИред
  1. рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд╕реНрдерд┐рд░ TSource LastOrDefault <TSource> ( рдпрд╣ IEnumerable <TSource> рд╕реНрд░реЛрдд) {
  2. рдЕрдЧрд░ (рд╕реНрд░реЛрдд == null ) рдереНрд░реЛ рдПрд░ред рдЕрд░реНрдЧрдирдореЗрдВрдЯ рдиреЙрд▓ ( "рд╕реНрд░реЛрдд" );
  3. IList <TSource> рд╕реВрдЪреА = IList <TSource> рдХреЗ рд░реВрдк рдореЗрдВ рд╕реНрд░реЛрдд;
  4. рдЕрдЧрд░ (рд╕реВрдЪреА! = рдЕрд╢рдХреНрдд ) {
  5. int count = list.Count;
  6. рдЕрдЧрд░ (рдЧрд┐рдирддреА> 0) рд╡рд╛рдкрд╕реА рд╕реВрдЪреА [рдЧрд┐рдирддреА - 1];
  7. }
  8. рдФрд░ {
* рдЗрд╕ рд╕реЛрд░реНрд╕ рдХреЛрдб рдХреЛ рд╕реЛрд░реНрд╕ рдХреЛрдб рд╣рд╛рдЗрд▓рд╛рдЗрдЯрд░ рдХреЗ рд╕рд╛рде рд╣рд╛рдЗрд▓рд╛рдЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред

рдЗрд╕реА рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЕрдиреБрдХреВрд▓рди рдПрдХрд▓ рдкреНрд░рдХрд╛рд░ рдХреЗ рддрд░реАрдХреЛрдВ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ
  1. рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд╕реНрдерд┐рд░ TSource рд╕рд┐рдВрдЧрд▓ <TSource> ( рдпрд╣ IEnumerable <TSource> рд╕реНрд░реЛрдд) {
  2. рдЕрдЧрд░ (рд╕реНрд░реЛрдд == null ) рдереНрд░реЛ рдПрд░ред рдЕрд░реНрдЧрдирдореЗрдВрдЯ рдиреЙрд▓ ( "рд╕реНрд░реЛрдд" );
  3. IList <TSource> рд╕реВрдЪреА = IList <TSource> рдХреЗ рд░реВрдк рдореЗрдВ рд╕реНрд░реЛрдд;
  4. рдЕрдЧрд░ (рд╕реВрдЪреА! = рдЕрд╢рдХреНрдд ) {
  5. рд╕реНрд╡рд┐рдЪ (рд╕реВрдЪреА.рдХрд╛рдЙрдВрдЯ) {
  6. рдХреЗрд╕ 0: рдПрд░рд░ рдлреЗрдВрдХреЛред рдиреЛрдПрд╕реЗрд▓реНрд╕ ();
  7. рд╕реНрдерд┐рддрд┐ 1: рд╡рд╛рдкрд╕реА рд╕реВрдЪреА [0];
* рдЗрд╕ рд╕реЛрд░реНрд╕ рдХреЛрдб рдХреЛ рд╕реЛрд░реНрд╕ рдХреЛрдб рд╣рд╛рдЗрд▓рд╛рдЗрдЯрд░ рдХреЗ рд╕рд╛рде рд╣рд╛рдЗрд▓рд╛рдЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред


2. GroupBy рдХрд╛ рдХрд╛рдо


рдорд╛рди рд▓реЗрдВ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдХреЛрдб рд╣реИ:
  1. рдХреНрд▓рд╛рд╕ рдХреА
  2. {
  3. рдирд┐рдЬреА рдЖрд╕рд╛рдиреА рд╕реЗ int _number;
  4. рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд╕реНрдереИрддрд┐рдХ int HashCallsCount;
  5. рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд╕реНрдерд┐рд░ int EqualsCountCount;
  6. рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдХреБрдВрдЬреА ( int рд╕рдВрдЦреНрдпрд╛)
  7. {
  8. _number = рд╕рдВрдЦреНрдпрд╛;
  9. }
  10. рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдмреВрд▓ рдмрд░рд╛рдмрд░ (рдореБрдЦреНрдп рдЕрдиреНрдп)
  11. {
  12. рдпрджрд┐ (рд╕рдВрджрд░реНрдн-рд╕рдВрдмрдВрдзреА ( рдЕрд╢рдХреНрдд , рдЕрдиреНрдп))
  13. {
  14. рдЭреВрдареЗ рд▓реМрдЯрдирд╛ ;
  15. }
  16. рдЕрдЧрд░ (рд╕рдВрджрд░реНрдн ( рдпрд╣ , рдЕрдиреНрдп))
  17. {
  18. рд╕рдЪ рд▓реМрдЯрдирд╛ ;
  19. }
  20. рдЕрдиреНрдп рд▓реМрдЯреЗрдВред _number == _number;
  21. }
  22. рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдУрд╡рд░рд░рд╛рдЗрдб рдмреВрд▓ рдмрд░рд╛рдмрд░ ( рдСрдмреНрдЬреЗрдХреНрдЯ рдУрдмреНрдЬ)
  23. {
  24. рдмрд░рд╛рдмрд░реА рдХрд╛ рдХреЗрдВрджреНрд░ ++;
  25. рдпрджрд┐ (рд╕рдВрджрд░реНрдн-рд╕рдВрдмрдВрдзреА ( рдЕрд╢рдХреНрдд , рдЕрдкреНрд░рд┐рдп))
  26. {
  27. рдЭреВрдареЗ рд▓реМрдЯрдирд╛ ;
  28. }
  29. рдЕрдЧрд░ (рд╕рдВрджрд░реНрдн рд╕рдВрджрд░реНрдн ( рдпрд╣ , obj))
  30. {
  31. рд╕рдЪ рд▓реМрдЯрдирд╛ ;
  32. }
  33. if (obj.GetType) (! = typeof (Key))
  34. {
  35. рдЭреВрдареЗ рд▓реМрдЯрдирд╛ ;
  36. }
  37. рдмрд░рд╛рдмрд░ ( рд╡рд╛рдкрд╕реА ) (рдХреБрдВрдЬреА) obj);
  38. }
  39. рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдУрд╡рд░рд░рд╛рдЗрдб int GetHashCode ()
  40. {
  41. HashCallsCount ++;
  42. рд╡рд╛рдкрд╕реА _number;
  43. }
  44. }
  45. рдХрдХреНрд╖рд╛ рдкрд░реАрдХреНрд╖рдг
  46. {
  47. рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ int рдирдВрдмрд░ { get ; рд╕реЗрдЯ ; }
  48. рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдирд╛рдо { рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ ; рд╕реЗрдЯ ; }
  49. рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдХреБрдВрдЬреА
  50. {
  51. { рд╡рд╛рдкрд╕реА рдирдИ рдХреБрдВрдЬреА (рд╕рдВрдЦреНрдпрд╛) ;;
  52. }
  53. рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдУрд╡рд░рд░рд╛рдЗрдб рд╕реНрдЯреНрд░рд┐рдВрдЧ ToString ()
  54. {
  55. рд╡рд╛рдкрд╕реА рд╕реНрдЯреНрд░рд┐рдВрдЧ .Format ( "рд╕рдВрдЦреНрдпрд╛: {0}, рдирд╛рдо: {1}" , рд╕рдВрдЦреНрдпрд╛, рдирд╛рдо);
  56. }
  57. }
  58. рдЖрдВрддрд░рд┐рдХ рд╡рд░реНрдЧ рдХрд╛рд░реНрдпрдХреНрд░рдо
  59. {
  60. рдирд┐рдЬреА рд╕реНрдерд┐рд░ рд╢реВрдиреНрдп рдореБрдЦреНрдп ( рд╕реНрдЯреНрд░рд┐рдВрдЧ [] args)
  61. {
  62. var рдЖрдЗрдЯрдо = Enumerable.Range (1, 20)ред рдЪрдпрди (x => рдирдпрд╛ рдкрд░реАрдХреНрд╖рдг {рд╕рдВрдЦреНрдпрд╛ = x% 3});
  63. foreach (рдЖрдЗрдЯрдореНрд╕ рдореЗрдВ var рд╕рдореВрд╣ ред GroupBy (x => x.Key))
  64. {
  65. рдХрдВрд╕реЛрд▓ .WriteLine ( "рд╕рдореВрд╣ рдХреБрдВрдЬреА: {0}" , group.Key);
  66. foreach (рд╕рдореВрд╣ рдореЗрдВ var рдЖрдЗрдЯрдо)
  67. {
  68. рдХрдВрд╕реЛрд▓ .WriteLine (рдЖрдЗрдЯрдо);
  69. }
  70. }
  71. рдХрдВрд╕реЛрд▓ .WriteLine ( "EqualsCallsCount {0}" , Key.EqualsCallsCount);
  72. рдХрдВрд╕реЛрд▓ .WriteLine ( "HashCallsCount {0}" , Key.HashCallsCount);
  73. }
  74. }
* рдЗрд╕ рд╕реЛрд░реНрд╕ рдХреЛрдб рдХреЛ рд╕реЛрд░реНрд╕ рдХреЛрдб рд╣рд╛рдЗрд▓рд╛рдЗрдЯрд░ рдХреЗ рд╕рд╛рде рд╣рд╛рдЗрд▓рд╛рдЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред

EqualsCallsCount рдФрд░ HashCallsCount рд╡реЗрд░рд┐рдПрдмрд▓реНрд╕ рдХреЗ рд▓рд┐рдП рдХреНрдпрд╛ рдореВрд▓реНрдп рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛? рдХреНрд░рдорд╢рдГ 17 рдФрд░ 20ред 17 - рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рди рдЬреЛ рд╕рдореВрд╣ рдХреБрдВрдЬреА рдмрди рдЧрдП рд╣реИрдВ, рдЙрдирдХреА рддреБрд▓рдирд╛ рдЕрдиреНрдп рдХреБрдВрдЬрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдирд╣реАрдВ рдХреА рдЬрд╛рдПрдЧреА (рдмрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдореИрдВ рдЗрдВрдЧрд┐рдд рдХрд░реВрдВрдЧрд╛ рдХрд┐ рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рд╕рдореВрд╣ рдмрд┐рд▓реНрдХреБрд▓ 3 рд╣реИ)ред 20 рдПрдХ рдЪреБрдиреМрддреА рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдореБрдЦреНрдп рдСрдмреНрдЬреЗрдХреНрдЯ рд╕реЗ рд╣реИрд╢ рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдЯреЗрд╕реНрдЯ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдХрд┐рд╕ рд╕рдореВрд╣ рдореЗрдВ рд░рдЦрд╛ рдЬрд╛рдПред рдпрд╣рд╛рдВ рдпрд╣ рдзреНрдпрд╛рди рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдпрджрд┐ рд╣реИрд╢рдХреЛрдб рдЕрджреНрд╡рд┐рддреАрдп рдорд╛рди рджреЗрдирд╛ рдмрдВрдж рдХрд░ рджреЗрддрд╛ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрд╣ рд╣рдореЗрд╢рд╛ 0 рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рдПрдЧрд╛), рддреЛ рдмрд░рд╛рдмрд░ рдХреА рдХреЙрд▓ рдХреА рд╕рдВрдЦреНрдпрд╛ рдмрдврд╝рдХрд░ 38 рд╣реЛ рдЬрд╛рдПрдЧреАред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХрд╛рд░рдг рд╕реНрдкрд╖реНрдЯ рд╣реИрдВред рдПрдХ рдФрд░ рджрд┐рд▓рдЪрд╕реНрдк рд╡рд┐рд╡рд░рдг рдпрд╣ рд╣реИ рдХрд┐ рд╕рдореВрд╣реЛрдВ рдХреА рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╕рд░рдгреА 7 рд╣реИ
  1. рд▓реБрдХрдЕрдк (IEqualityComparer <TKey> рддреБрд▓рдирд┐рддреНрд░) {
  2. if (рддреБрд▓рдирд╛ == null ) рддреБрд▓рдирд╛рдХрд░реНрддрд╛ = EqualityComparer <TKey> .Default;
  3. this .comparer = рддреБрд▓рдирд╛;
  4. рд╕рдореВрд╣ = рдирдпрд╛ рд╕рдореВрд╣рди [7];
  5. }
* рдЗрд╕ рд╕реЛрд░реНрд╕ рдХреЛрдб рдХреЛ рд╕реЛрд░реНрд╕ рдХреЛрдб рд╣рд╛рдЗрд▓рд╛рдЗрдЯрд░ рдХреЗ рд╕рд╛рде рд╣рд╛рдЗрд▓рд╛рдЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред

рдФрд░ рдлрд┐рд░ рдпрд╣ рд░реИрдЦрд┐рдХ рд░реВрдк рд╕реЗ рдмрдврд╝рддрд╛ рд╣реИ, рдЗрд╕ рдЪрд░рдг рдореЗрдВ рдкреВрд░реЗ рд╕рд░рдгреА рдХреА рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдмрдирд╛рддрд╛ рд╣реИред
  1. рд╢реВрдиреНрдп рдЖрдХрд╛рд░ () {
  2. int newSize = рдЪреЗрдХ рдХрд┐рдпрд╛ рдЧрдпрд╛ (рдЧрдгрдирд╛ * 2 + 1);
  3. рд╕рдореВрд╣реАрдХрд░рдг [] newGroupings = рдирдпрд╛ рд╕рдореВрд╣реАрдХрд░рдг [newSize];
  4. рдЧреНрд░реБрдкрд┐рдВрдЧ рдЬреА = lastGrouping;
  5. рдХрд░реЛ {
  6. g = g.next;
  7. int index = g.hashCode% newSize;
  8. g.hashNext = newGroupings [рд╕реВрдЪрдХрд╛рдВрдХ];
  9. newGroupings [рд╕реВрдЪрдХрд╛рдВрдХ] = рдЬреА;
  10. } рдЬрдмрдХрд┐ (рдЬреА! = lastGrouping);
  11. рд╕рдореВрд╣реАрдХрд░рдг = newGroupings;
  12. }
* рдЗрд╕ рд╕реЛрд░реНрд╕ рдХреЛрдб рдХреЛ рд╕реЛрд░реНрд╕ рдХреЛрдб рд╣рд╛рдЗрд▓рд╛рдЗрдЯрд░ рдХреЗ рд╕рд╛рде рд╣рд╛рдЗрд▓рд╛рдЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред

рдХреНрдпреЛрдВрдХрд┐ рдЖрдк GroupBy рд╡рд┐рдзрд┐ рдХреЗ рд▓рд┐рдП рдХреНрд╖рдорддрд╛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ, рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдХреБрдВрдЬрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рд╕рдореВрд╣реАрдХрд░рдг рдХрд░рдиреЗ рд╕реЗ рдмрдЪрдирд╛ рдмреЗрд╣рддрд░ рд╣реИ, рдЕрдиреНрдпрдерд╛ рдореБрдЭреЗ рдореЗрдореЛрд░реА рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИ (рдареАрдХ рд╣реИ, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдЧрддрд┐ рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рдПрдЧреА)ред

3. рдПрдиреНрдпреВрдорд░реЗрдЯрд░ рднреА рдПрдХ рд╡рд╕реНрддреБ рд╣реИ


рдЖрдЗрдП рджреЛ рдХрд╛рд░реНрдпреЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:
  1. рдирд┐рдЬреА рд╕реНрдерд┐рд░ IEnumerable <Test> SortTest (Func < IEnumerable <Test >> list)
  2. {
  3. foreach (рд╕реВрдЪреА рдореЗрдВ var рдЖрдЗрдЯрдо) ()ред OrderBy (x => x.Number) .ThenBy (x => x.Name))
  4. {
  5. рдЙрдкрдЬ рд╡рд╛рдкрд╕реА рдЖрдЗрдЯрдо;
  6. }
  7. }
* рдЗрд╕ рд╕реЛрд░реНрд╕ рдХреЛрдб рдХреЛ рд╕реЛрд░реНрд╕ рдХреЛрдб рд╣рд╛рдЗрд▓рд╛рдЗрдЯрд░ рдХреЗ рд╕рд╛рде рд╣рд╛рдЗрд▓рд╛рдЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред

рдФрд░
  1. рдирд┐рдЬреА рд╕реНрдерд┐рд░ IEnumerable <Test> SortTest2 (Func < IEnumerable <Test >> list)
  2. {
  3. рд╡рд╛рдкрд╕реА рд╕реВрдЪреА ()ред рдСрд░реНрдбрд░рдмреА (x => x.Number) .ThenBy (x => x.Name);
  4. }
* рдЗрд╕ рд╕реЛрд░реНрд╕ рдХреЛрдб рдХреЛ рд╕реЛрд░реНрд╕ рдХреЛрдб рд╣рд╛рдЗрд▓рд╛рдЗрдЯрд░ рдХреЗ рд╕рд╛рде рд╣рд╛рдЗрд▓рд╛рдЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред

рд╣рдо рдорд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рд╕реВрдЪреА () рддрддреНрд╡реЛрдВ рдХреА рдПрдХ рд╕реНрдерд┐рд░ рд╕реВрдЪреА рджреЗрддрд╛ рд╣реИ, рдЬреИрд╕реЗ рдХрд┐ рдПрдХ рд╕рд░рдгреАред рдХреНрдпрд╛ рдХрд╛рд░реНрдп рд╕рдорд╛рди рд╣реИрдВ? рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ (рдкрд┐рдЫрд▓реЗ рдкреБрдирд░реНрд╡рд┐рддреНрдд рдореЗрдВ рд╡реИрд╕реЗ рднреА рдПрдХ рдмрдЧ рдирд╣реАрдВ рд╣реИ )ред рдкрд╣рд▓реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╕реВрдЪреА () рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд╣рдореЗрд╢рд╛ рдХрд╣рд╛ рдЬрд╛рдПрдЧрд╛ рдЬрдм рд╣рдо рд▓реМрдЯреЗ рдкреНрд░рдЧрдгрдХ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬрд╛рддреЗ рд╣реИрдВред рдФрд░ рддрджрдиреБрд╕рд╛рд░, рдпрджрд┐ рд╣рдо рдЕрдиреНрдп рдореВрд▓реНрдпреЛрдВ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдПрдиреНрдпреВрдорд░реЗрдЯрд░ рдХреЗ рдореВрд▓реНрдп рдЕрд▓рдЧ рд╣реЛ рдЬрд╛рдПрдВрдЧреЗред рджреВрд╕рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╕реВрдЪреА () рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЗрд╡рд▓ рдПрдХ рдмрд╛рд░ рдХрд╣рд╛ рдЬрд╛рдПрдЧрд╛, рдЗрд╕рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдСрд░реНрдбрд░рдбреЗрдиреНрдпреВрдореЗрд░реЗрдмрд▓ <Telement, TKey> рд╡рд░реНрдЧ рдХреЗ рд╕реНрд░реЛрдд рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдФрд░ рднрд╡рд┐рд╖реНрдп рдореЗрдВ, рдЪрд╛рд╣реЗ рд╣рдо рдХрд┐рддрдиреЗ рднреА рд░рд┐рдЯрд░реНрди рд╡рд╛рд▓реЗ рдЧреБрдордЯреА рд╕реЗ рдЧреБрдЬрд░реЗрдВ , рдЗрд╕рдореЗрдВ рдорд╛рди рд╕рдорд╛рди рд╣реЛрдВрдЧреЗред

рдирд┐рд╖реНрдХрд░реНрд╖


рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдпрд╣ рдЫреЛрдЯрд╛ рд▓реЗрдЦ рдХрд┐рд╕реА рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛ рдФрд░ рд▓рд┐рдирдХ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдкрд░ рддреНрд░реБрдЯрд┐рдпреЛрдВ рд╕реЗ рдмрдЪрдиреЗ рдореЗрдВ рдорджрдж рдХрд░реЗрдЧрд╛ред рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ рдФрд░ рдкрд░рд┐рд╡рд░реНрдзрди рдХрд╛ рд╕реНрд╡рд╛рдЧрдд рд╣реИред

рд╕рдВрджрд░реНрдн


MSDN рдУ LINQ

рдЖрдкрдХрд╛ рдзреНрдпрд╛рди рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред

Source: https://habr.com/ru/post/In124231/


All Articles