2014-02-09 6 views
0

я задавался вопрос, есть ли способ сортировки с помощью LINQ этого куска данных:LINQ - Как я могу сортировать эти данные в одном запросе

Firstname lastname age 
Xxxxxxxxx xxxxxxxxx xxxx 
Xxxxxxxxx xxxxxxxxx xxxx 
* group YYYY <---- contained at firstName column 
Xxxxxxxxx xxxxxxxxx xxxx 
Xxxxxxxxx xxxxxxxxx xxxx 
* group BBB 
Xxxxxxxxx xxxxxxxxx xxxx 
Xxxxxxxxx xxxxxxxxx xxxx 
* group LLL 

To:

Group  Firstname lastname age 
YYYY  Xxxxxxxxx xxxxxxxxx xxxx 
YYYY  xxxxxxxxx xxxxxxxxx xxxx 
BBB   Xxxxxxxxx xxxxxxxxx xxxx 
BBB   Xxxxxxxxx xxxxxxxxx xxxx 
LLL   Xxxxxxxxx xxxxxxxxx xxxx 
LLL   xxxxxxxxx xxxxxxxxx xxxx 

я уже сделал он, используя оператор For, начиная с конца списка, чтобы получить имя группы, затем сохраните это значение в локальной переменной и продолжайте заполнять столбец группы этим “group name”, затем я использую LINQ для выбора всего, где столбец FirstName не содержит *.

Любые идеи?

+0

Показать текущий код. – MarcinJuraszek

ответ

2

Вы можете сделать это с помощью агрегата:

public static void Main() 
{ 
    var data = new MyClass[] 
    { 
     new MyClass{FirstName="Tom"}, 
     new MyClass{FirstName="Dick"}, 
     new MyClass{FirstName="Harry"}, 
     new MyClass{FirstName="* group YYYY"}, 
     new MyClass{FirstName="Matthew"}, 
     new MyClass{FirstName="Mark"}, 
     new MyClass{FirstName="Luke"}, 
     new MyClass{FirstName="John"}, 
     new MyClass{FirstName="* group BBB"}, 
     new MyClass{FirstName="Moe"}, 
     new MyClass{FirstName="Larry"}, 
     new MyClass{FirstName="Curly"}, 
     new MyClass{FirstName="* group LLL"}, 
    }; 

    var groups = new Dictionary<string, List<MyClass>>(); 
    data.Aggregate(new List<MyClass>(), (a, b) => 
    { 
     if (b.FirstName.StartsWith("* group ")) 
     { 
      groups[b.FirstName.Substring(8)] = a; 
      return new List<MyClass>(); 
     } 
     a.Add(b); 
     return a; 
    }); 

    foreach (var group in groups.Keys) 
     foreach (var record in groups[group]) 
      Console.WriteLine("{0} {1}", group, record.FirstName); 
} 

public class MyClass 
{ 
    public string FirstName { get; set; } 
} 

Выход:

YYYY Tom 
YYYY Dick 
YYYY Harry 
BBB Matthew 
BBB Mark 
BBB Luke 
BBB John 
LLL Moe 
LLL Larry 
LLL Curly 
+0

Whoa !! просто потрясающий и мощный. Спасибо, сэр. – Urah

Смежные вопросы