2016-12-16 2 views
1

У меня есть список с 3 записей -Список фильтров

public class entry 
{ 
    string name; 
    string age; 
    string likes;  
} 

List<entry> groupEntry = new List<entry>(); 

Где -

groupEntry[0].name = "john"; 
groupEntry[0].age= "26"; 
groupEntry[0].likes= "cats"; 

groupEntry[1].name = "john"; 
groupEntry[1].age= "26"; 
groupEntry[1].likes= "dogs"; 

groupEntry[2].name = "matt"; 
groupEntry[2].age= "32"; 
groupEntry[2].likes= "frogs"; 

Что я пытаюсь сделать, это создать новый список, в котором имя является уникальным идентификатором, и просто создать одну запись для одного имени, однако добавить любит вместе в на массив строк с результирующий список выглядит как -

public class filteredEntry 
{ 
    string name; 
    string age; 
    List<string> likes;  
} 

List<filteredEntry> filteredGroupEntry = new List<filteredEntry>(); 

filteredGroupEntry [0].name = "john"; 
filteredGroupEntry [0].age= "26"; 
filteredGroupEntry [0].likes= ["cats", "dogs"]; 

filteredGroupEntry [1].name = "matt"; 
filteredGroupEntry [1].age= "32"; 
filteredGroupEntry [1].likes= "frogs"; 

Мой т houghts должны были сделать foreach с groupEntry, и каждый раз, когда запись [i] .name меняет новую запись в filteredGroupEntry, однако не удалось заставить ее работать с новым массивом для likes. Как я могу это достичь?

+0

Это потребует нового класса, так как вы хотите 'Список ' вместо строки. – juharr

+0

Ваш отфильтрованный список не может быть типа 'List ', так как поле dob/likes - это строка, но вы хотите иметь массив строк. – stuartd

+0

обновили соответственно извините, я пропустил эту часть – Ebikeneser

ответ

2

Прежде всего, вам необходимо создать поля в вашем entry классе public. До сих пор ваш код не будет компилироваться.

Во-вторых, что likes уже string, так что вы не можете преобразовать его в массив, но то, что вы могли бы сделать, это просто сцепить все вещи, что человек любит и разделить их с ,. Таким образом, вы будете группировать по имени и принимать все значения likes в одной строке. Этот код имеет только первую age значение (при условии, что это всегда тот же самый Джон с того же возраста может быть не самым умным решением.

List<entry> filteredList = groupEntry.GroupBy(x => x.name) 
     .Select(x => new entry 
     { 
      name = x.First().name, 
      age = x.First().age, 
      likes = String.Join(", ", x.Select(l=>l.likes)) 
     }).ToList(); 

Позже, когда вы хотите, чтобы отделить like рюшечки снова можно разделить на , так:

string [] allOneLikes = filteredList[0].likes.Split(','); 

EDIT:

Я только что видел, что вы редактировали ваше сообщение и добавил filteredEntry. Это, конечно, меняет ситуацию. Таким образом, вы могли бы использовать этот класс в Select заявлении:

List<filteredEntry> filteredList = groupEntry.GroupBy(x => x.name) 
     .Select(x => new filteredEntry 
     { 
      name = x.First().name, 
      age = x.First().age, 
      likes = x.Select(l=>l.likes).ToList() 
     }).ToList(); 
+0

попал туда первым, так правильно обозначил! Отлично. – Ebikeneser

2

Я предлагаю группировку по через Linq:

List<filteredEntry> filteredGroupEntry = groupEntry 
    .GroupBy(entry => new { // grouping by name + age 
    name = entry.name, 
    age = entry.age}) 
    .Select(chunk => new filteredEntry() { 
    name = chunk.Key.name, 
    age = chunk.Key.age, 
    // collapse all likes into list 
    likes = chunk.Select(entry => entry.likes).ToList()}) 
    .ToList(); 
+0

Отличный ответ Дмитрий, однако Монг Чжу попал туда перед вами. – Ebikeneser

+0

@ Ebikeneser: добро пожаловать! –

+0

@DmitryBychenko Я приветствую еще раз. Особенно для группировки ** name && age **! –