2016-12-16 151 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"; 

我的T houghts与groupEntry做一个foreach,并且每次输入[i] .name更改在filteredGroupEntry中创建新记录,但是无法使用likes的新数组处理此问题。我怎样才能做到这一点?

+0

这将需要一个新的类,因为你想有一个'名单'所以,你可以再在Select语句中使用这个类而不是“字符串”。 – juharr

+0

您的过滤列表不能是'列表',因为dob/likes字段是一个字符串,但是您希望有一个字符串数组。 – stuartd

+0

已经相应更新了对不起,我错过了那部分 – Ebikeneser

回答

2

首先,您需要在entrypublic中设置字段。到目前为止,您的代码不会编译。

其次是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(','); 

编辑:

我刚才看到您编辑您的文章,并添加了filteredEntry班。 这改变了当然的情况。

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我再次致敬。尤其是**名称和年龄的分组! –