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 .
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 .
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> рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдЕрдВрддрд┐рдо рддрддреНрд╡ рдЗрдВрдбреЗрдХреНрд╕рд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдЬреЛ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЗрддрдирд╛ рдмреБрд░рд╛ рдирд╣реАрдВ рд╣реИред
- рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд╕реНрдерд┐рд░ TSource LastOrDefault <TSource> ( рдпрд╣ IEnumerable <TSource> рд╕реНрд░реЛрдд) {
- рдЕрдЧрд░ (рд╕реНрд░реЛрдд == null ) рдереНрд░реЛ рдПрд░ред рдЕрд░реНрдЧрдирдореЗрдВрдЯ рдиреЙрд▓ ( "рд╕реНрд░реЛрдд" );
- IList <TSource> рд╕реВрдЪреА = IList <TSource> рдХреЗ рд░реВрдк рдореЗрдВ рд╕реНрд░реЛрдд;
- рдЕрдЧрд░ (рд╕реВрдЪреА! = рдЕрд╢рдХреНрдд ) {
- int count = list.Count;
- рдЕрдЧрд░ (рдЧрд┐рдирддреА> 0) рд╡рд╛рдкрд╕реА рд╕реВрдЪреА [рдЧрд┐рдирддреА - 1];
- }
- рдФрд░ {
* рдЗрд╕ рд╕реЛрд░реНрд╕ рдХреЛрдб рдХреЛ рд╕реЛрд░реНрд╕ рдХреЛрдб рд╣рд╛рдЗрд▓рд╛рдЗрдЯрд░ рдХреЗ рд╕рд╛рде рд╣рд╛рдЗрд▓рд╛рдЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
рдЗрд╕реА рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЕрдиреБрдХреВрд▓рди
рдПрдХрд▓ рдкреНрд░рдХрд╛рд░ рдХреЗ рддрд░реАрдХреЛрдВ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ
- рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд╕реНрдерд┐рд░ TSource рд╕рд┐рдВрдЧрд▓ <TSource> ( рдпрд╣ IEnumerable <TSource> рд╕реНрд░реЛрдд) {
- рдЕрдЧрд░ (рд╕реНрд░реЛрдд == null ) рдереНрд░реЛ рдПрд░ред рдЕрд░реНрдЧрдирдореЗрдВрдЯ рдиреЙрд▓ ( "рд╕реНрд░реЛрдд" );
- IList <TSource> рд╕реВрдЪреА = IList <TSource> рдХреЗ рд░реВрдк рдореЗрдВ рд╕реНрд░реЛрдд;
- рдЕрдЧрд░ (рд╕реВрдЪреА! = рдЕрд╢рдХреНрдд ) {
- рд╕реНрд╡рд┐рдЪ (рд╕реВрдЪреА.рдХрд╛рдЙрдВрдЯ) {
- рдХреЗрд╕ 0: рдПрд░рд░ рдлреЗрдВрдХреЛред рдиреЛрдПрд╕реЗрд▓реНрд╕ ();
- рд╕реНрдерд┐рддрд┐ 1: рд╡рд╛рдкрд╕реА рд╕реВрдЪреА [0];
* рдЗрд╕ рд╕реЛрд░реНрд╕ рдХреЛрдб рдХреЛ рд╕реЛрд░реНрд╕ рдХреЛрдб рд╣рд╛рдЗрд▓рд╛рдЗрдЯрд░ рдХреЗ рд╕рд╛рде рд╣рд╛рдЗрд▓рд╛рдЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
2. GroupBy рдХрд╛ рдХрд╛рдо
рдорд╛рди рд▓реЗрдВ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдХреЛрдб рд╣реИ:
- рдХреНрд▓рд╛рд╕ рдХреА
- {
- рдирд┐рдЬреА рдЖрд╕рд╛рдиреА рд╕реЗ int _number;
- рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд╕реНрдереИрддрд┐рдХ int HashCallsCount;
- рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд╕реНрдерд┐рд░ int EqualsCountCount;
- рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдХреБрдВрдЬреА ( int рд╕рдВрдЦреНрдпрд╛)
- {
- _number = рд╕рдВрдЦреНрдпрд╛;
- }
- рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдмреВрд▓ рдмрд░рд╛рдмрд░ (рдореБрдЦреНрдп рдЕрдиреНрдп)
- {
- рдпрджрд┐ (рд╕рдВрджрд░реНрдн-рд╕рдВрдмрдВрдзреА ( рдЕрд╢рдХреНрдд , рдЕрдиреНрдп))
- {
- рдЭреВрдареЗ рд▓реМрдЯрдирд╛ ;
- }
- рдЕрдЧрд░ (рд╕рдВрджрд░реНрдн ( рдпрд╣ , рдЕрдиреНрдп))
- {
- рд╕рдЪ рд▓реМрдЯрдирд╛ ;
- }
- рдЕрдиреНрдп рд▓реМрдЯреЗрдВред _number == _number;
- }
- рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдУрд╡рд░рд░рд╛рдЗрдб рдмреВрд▓ рдмрд░рд╛рдмрд░ ( рдСрдмреНрдЬреЗрдХреНрдЯ рдУрдмреНрдЬ)
- {
- рдмрд░рд╛рдмрд░реА рдХрд╛ рдХреЗрдВрджреНрд░ ++;
- рдпрджрд┐ (рд╕рдВрджрд░реНрдн-рд╕рдВрдмрдВрдзреА ( рдЕрд╢рдХреНрдд , рдЕрдкреНрд░рд┐рдп))
- {
- рдЭреВрдареЗ рд▓реМрдЯрдирд╛ ;
- }
- рдЕрдЧрд░ (рд╕рдВрджрд░реНрдн рд╕рдВрджрд░реНрдн ( рдпрд╣ , obj))
- {
- рд╕рдЪ рд▓реМрдЯрдирд╛ ;
- }
- if (obj.GetType) (! = typeof (Key))
- {
- рдЭреВрдареЗ рд▓реМрдЯрдирд╛ ;
- }
- рдмрд░рд╛рдмрд░ ( рд╡рд╛рдкрд╕реА ) (рдХреБрдВрдЬреА) obj);
- }
- рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдУрд╡рд░рд░рд╛рдЗрдб int GetHashCode ()
- {
- HashCallsCount ++;
- рд╡рд╛рдкрд╕реА _number;
- }
- }
- рдХрдХреНрд╖рд╛ рдкрд░реАрдХреНрд╖рдг
- {
- рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ int рдирдВрдмрд░ { get ; рд╕реЗрдЯ ; }
- рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдирд╛рдо { рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ ; рд╕реЗрдЯ ; }
- рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдХреБрдВрдЬреА
- {
- { рд╡рд╛рдкрд╕реА рдирдИ рдХреБрдВрдЬреА (рд╕рдВрдЦреНрдпрд╛) ;;
- }
- рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдУрд╡рд░рд░рд╛рдЗрдб рд╕реНрдЯреНрд░рд┐рдВрдЧ ToString ()
- {
- рд╡рд╛рдкрд╕реА рд╕реНрдЯреНрд░рд┐рдВрдЧ .Format ( "рд╕рдВрдЦреНрдпрд╛: {0}, рдирд╛рдо: {1}" , рд╕рдВрдЦреНрдпрд╛, рдирд╛рдо);
- }
- }
- рдЖрдВрддрд░рд┐рдХ рд╡рд░реНрдЧ рдХрд╛рд░реНрдпрдХреНрд░рдо
- {
- рдирд┐рдЬреА рд╕реНрдерд┐рд░ рд╢реВрдиреНрдп рдореБрдЦреНрдп ( рд╕реНрдЯреНрд░рд┐рдВрдЧ [] args)
- {
- var рдЖрдЗрдЯрдо = Enumerable.Range (1, 20)ред рдЪрдпрди (x => рдирдпрд╛ рдкрд░реАрдХреНрд╖рдг {рд╕рдВрдЦреНрдпрд╛ = x% 3});
- foreach (рдЖрдЗрдЯрдореНрд╕ рдореЗрдВ var рд╕рдореВрд╣ ред GroupBy (x => x.Key))
- {
- рдХрдВрд╕реЛрд▓ .WriteLine ( "рд╕рдореВрд╣ рдХреБрдВрдЬреА: {0}" , group.Key);
- foreach (рд╕рдореВрд╣ рдореЗрдВ var рдЖрдЗрдЯрдо)
- {
- рдХрдВрд╕реЛрд▓ .WriteLine (рдЖрдЗрдЯрдо);
- }
- }
- рдХрдВрд╕реЛрд▓ .WriteLine ( "EqualsCallsCount {0}" , Key.EqualsCallsCount);
- рдХрдВрд╕реЛрд▓ .WriteLine ( "HashCallsCount {0}" , Key.HashCallsCount);
- }
- }
* рдЗрд╕ рд╕реЛрд░реНрд╕ рдХреЛрдб рдХреЛ рд╕реЛрд░реНрд╕ рдХреЛрдб рд╣рд╛рдЗрд▓рд╛рдЗрдЯрд░ рдХреЗ рд╕рд╛рде рд╣рд╛рдЗрд▓рд╛рдЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
EqualsCallsCount рдФрд░
HashCallsCount рд╡реЗрд░рд┐рдПрдмрд▓реНрд╕ рдХреЗ рд▓рд┐рдП рдХреНрдпрд╛ рдореВрд▓реНрдп рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛? рдХреНрд░рдорд╢рдГ 17 рдФрд░ 20ред 17 - рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рди рдЬреЛ рд╕рдореВрд╣ рдХреБрдВрдЬреА рдмрди рдЧрдП рд╣реИрдВ, рдЙрдирдХреА рддреБрд▓рдирд╛ рдЕрдиреНрдп рдХреБрдВрдЬрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдирд╣реАрдВ рдХреА рдЬрд╛рдПрдЧреА (рдмрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдореИрдВ рдЗрдВрдЧрд┐рдд рдХрд░реВрдВрдЧрд╛ рдХрд┐ рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рд╕рдореВрд╣ рдмрд┐рд▓реНрдХреБрд▓ 3 рд╣реИ)ред 20 рдПрдХ рдЪреБрдиреМрддреА рд╣реИ, рдХреНрдпреЛрдВрдХрд┐
рдореБрдЦреНрдп рдСрдмреНрдЬреЗрдХреНрдЯ рд╕реЗ рд╣реИрд╢ рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐
рдЯреЗрд╕реНрдЯ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдХрд┐рд╕ рд╕рдореВрд╣ рдореЗрдВ рд░рдЦрд╛ рдЬрд╛рдПред рдпрд╣рд╛рдВ рдпрд╣ рдзреНрдпрд╛рди рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдпрджрд┐ рд╣реИрд╢рдХреЛрдб рдЕрджреНрд╡рд┐рддреАрдп рдорд╛рди рджреЗрдирд╛ рдмрдВрдж рдХрд░ рджреЗрддрд╛ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрд╣ рд╣рдореЗрд╢рд╛ 0 рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рдПрдЧрд╛), рддреЛ рдмрд░рд╛рдмрд░ рдХреА рдХреЙрд▓ рдХреА рд╕рдВрдЦреНрдпрд╛ рдмрдврд╝рдХрд░ 38 рд╣реЛ рдЬрд╛рдПрдЧреАред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХрд╛рд░рдг рд╕реНрдкрд╖реНрдЯ рд╣реИрдВред рдПрдХ рдФрд░ рджрд┐рд▓рдЪрд╕реНрдк рд╡рд┐рд╡рд░рдг рдпрд╣ рд╣реИ рдХрд┐ рд╕рдореВрд╣реЛрдВ рдХреА рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╕рд░рдгреА 7 рд╣реИ
- рд▓реБрдХрдЕрдк (IEqualityComparer <TKey> рддреБрд▓рдирд┐рддреНрд░) {
- if (рддреБрд▓рдирд╛ == null ) рддреБрд▓рдирд╛рдХрд░реНрддрд╛ = EqualityComparer <TKey> .Default;
- this .comparer = рддреБрд▓рдирд╛;
- рд╕рдореВрд╣ = рдирдпрд╛ рд╕рдореВрд╣рди [7];
- }
* рдЗрд╕ рд╕реЛрд░реНрд╕ рдХреЛрдб рдХреЛ рд╕реЛрд░реНрд╕ рдХреЛрдб рд╣рд╛рдЗрд▓рд╛рдЗрдЯрд░ рдХреЗ рд╕рд╛рде рд╣рд╛рдЗрд▓рд╛рдЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
рдФрд░ рдлрд┐рд░ рдпрд╣ рд░реИрдЦрд┐рдХ рд░реВрдк рд╕реЗ рдмрдврд╝рддрд╛ рд╣реИ, рдЗрд╕ рдЪрд░рдг рдореЗрдВ рдкреВрд░реЗ рд╕рд░рдгреА рдХреА рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдмрдирд╛рддрд╛ рд╣реИред
- рд╢реВрдиреНрдп рдЖрдХрд╛рд░ () {
- int newSize = рдЪреЗрдХ рдХрд┐рдпрд╛ рдЧрдпрд╛ (рдЧрдгрдирд╛ * 2 + 1);
- рд╕рдореВрд╣реАрдХрд░рдг [] newGroupings = рдирдпрд╛ рд╕рдореВрд╣реАрдХрд░рдг [newSize];
- рдЧреНрд░реБрдкрд┐рдВрдЧ рдЬреА = lastGrouping;
- рдХрд░реЛ {
- g = g.next;
- int index = g.hashCode% newSize;
- g.hashNext = newGroupings [рд╕реВрдЪрдХрд╛рдВрдХ];
- newGroupings [рд╕реВрдЪрдХрд╛рдВрдХ] = рдЬреА;
- } рдЬрдмрдХрд┐ (рдЬреА! = lastGrouping);
- рд╕рдореВрд╣реАрдХрд░рдг = newGroupings;
- }
* рдЗрд╕ рд╕реЛрд░реНрд╕ рдХреЛрдб рдХреЛ рд╕реЛрд░реНрд╕ рдХреЛрдб рд╣рд╛рдЗрд▓рд╛рдЗрдЯрд░ рдХреЗ рд╕рд╛рде рд╣рд╛рдЗрд▓рд╛рдЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
рдХреНрдпреЛрдВрдХрд┐
рдЖрдк GroupBy рд╡рд┐рдзрд┐ рдХреЗ рд▓рд┐рдП рдХреНрд╖рдорддрд╛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдирд╣реАрдВ
рдХрд░ рд╕рдХрддреЗ, рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдХреБрдВрдЬрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рд╕рдореВрд╣реАрдХрд░рдг рдХрд░рдиреЗ рд╕реЗ рдмрдЪрдирд╛ рдмреЗрд╣рддрд░ рд╣реИ, рдЕрдиреНрдпрдерд╛ рдореБрдЭреЗ рдореЗрдореЛрд░реА рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИ (рдареАрдХ рд╣реИ, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдЧрддрд┐ рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рдПрдЧреА)ред
3. рдПрдиреНрдпреВрдорд░реЗрдЯрд░ рднреА рдПрдХ рд╡рд╕реНрддреБ рд╣реИ
рдЖрдЗрдП рджреЛ рдХрд╛рд░реНрдпреЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:
- рдирд┐рдЬреА рд╕реНрдерд┐рд░ IEnumerable <Test> SortTest (Func < IEnumerable <Test >> list)
- {
- foreach (рд╕реВрдЪреА рдореЗрдВ var рдЖрдЗрдЯрдо) ()ред OrderBy (x => x.Number) .ThenBy (x => x.Name))
- {
- рдЙрдкрдЬ рд╡рд╛рдкрд╕реА рдЖрдЗрдЯрдо;
- }
- }
* рдЗрд╕ рд╕реЛрд░реНрд╕ рдХреЛрдб рдХреЛ рд╕реЛрд░реНрд╕ рдХреЛрдб рд╣рд╛рдЗрд▓рд╛рдЗрдЯрд░ рдХреЗ рд╕рд╛рде рд╣рд╛рдЗрд▓рд╛рдЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
рдФрд░
- рдирд┐рдЬреА рд╕реНрдерд┐рд░ IEnumerable <Test> SortTest2 (Func < IEnumerable <Test >> list)
- {
- рд╡рд╛рдкрд╕реА рд╕реВрдЪреА ()ред рдСрд░реНрдбрд░рдмреА (x => x.Number) .ThenBy (x => x.Name);
- }
* рдЗрд╕ рд╕реЛрд░реНрд╕ рдХреЛрдб рдХреЛ рд╕реЛрд░реНрд╕ рдХреЛрдб рд╣рд╛рдЗрд▓рд╛рдЗрдЯрд░ рдХреЗ рд╕рд╛рде рд╣рд╛рдЗрд▓рд╛рдЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
рд╣рдо рдорд╛рдирддреЗ рд╣реИрдВ рдХрд┐
рд╕реВрдЪреА () рддрддреНрд╡реЛрдВ рдХреА рдПрдХ рд╕реНрдерд┐рд░ рд╕реВрдЪреА рджреЗрддрд╛ рд╣реИ, рдЬреИрд╕реЗ рдХрд┐ рдПрдХ рд╕рд░рдгреАред рдХреНрдпрд╛ рдХрд╛рд░реНрдп рд╕рдорд╛рди рд╣реИрдВ? рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ (рдкрд┐рдЫрд▓реЗ рдкреБрдирд░реНрд╡рд┐рддреНрдд рдореЗрдВ рд╡реИрд╕реЗ рднреА рдПрдХ
рдмрдЧ рдирд╣реАрдВ рд╣реИ )ред рдкрд╣рд▓реЗ рдорд╛рдорд▓реЗ рдореЗрдВ,
рд╕реВрдЪреА () рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд╣рдореЗрд╢рд╛ рдХрд╣рд╛ рдЬрд╛рдПрдЧрд╛ рдЬрдм рд╣рдо рд▓реМрдЯреЗ рдкреНрд░рдЧрдгрдХ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬрд╛рддреЗ рд╣реИрдВред рдФрд░ рддрджрдиреБрд╕рд╛рд░, рдпрджрд┐ рд╣рдо рдЕрдиреНрдп рдореВрд▓реНрдпреЛрдВ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдПрдиреНрдпреВрдорд░реЗрдЯрд░ рдХреЗ рдореВрд▓реНрдп рдЕрд▓рдЧ рд╣реЛ рдЬрд╛рдПрдВрдЧреЗред рджреВрд╕рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ,
рд╕реВрдЪреА () рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЗрд╡рд▓ рдПрдХ рдмрд╛рд░ рдХрд╣рд╛ рдЬрд╛рдПрдЧрд╛, рдЗрд╕рдХрд╛ рдкрд░рд┐рдгрд╛рдо
рдСрд░реНрдбрд░рдбреЗрдиреНрдпреВрдореЗрд░реЗрдмрд▓ <Telement, TKey> рд╡рд░реНрдЧ рдХреЗ
рд╕реНрд░реЛрдд рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдФрд░ рднрд╡рд┐рд╖реНрдп рдореЗрдВ, рдЪрд╛рд╣реЗ рд╣рдо рдХрд┐рддрдиреЗ рднреА
рд░рд┐рдЯрд░реНрди рд╡рд╛рд▓реЗ
рдЧреБрдордЯреА рд╕реЗ
рдЧреБрдЬрд░реЗрдВ , рдЗрд╕рдореЗрдВ рдорд╛рди рд╕рдорд╛рди рд╣реЛрдВрдЧреЗред
рдирд┐рд╖реНрдХрд░реНрд╖
рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдпрд╣ рдЫреЛрдЯрд╛ рд▓реЗрдЦ рдХрд┐рд╕реА рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛ рдФрд░ рд▓рд┐рдирдХ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдкрд░ рддреНрд░реБрдЯрд┐рдпреЛрдВ рд╕реЗ рдмрдЪрдиреЗ рдореЗрдВ рдорджрдж рдХрд░реЗрдЧрд╛ред рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ рдФрд░ рдкрд░рд┐рд╡рд░реНрдзрди рдХрд╛ рд╕реНрд╡рд╛рдЧрдд рд╣реИред
рд╕рдВрджрд░реНрдн
MSDN рдУ LINQрдЖрдкрдХрд╛ рдзреНрдпрд╛рди рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред