2016-12-16 115 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我再次致敬。尤其是**名稱和年齡的分組! –