2011-04-06 64 views
4

我遇到了一小段代碼的問題。在項目列表中引用屬性

我有一個MapItem類的列表與一對夫婦性質,地址和HTML,我需要有一個相同的地址屬性 來連接各個項目的HTML屬性例如:

firstMapItem = new MapItem { Address = "1122 Elm Street", 
          Html="<p>some html</p>" }; 
secondMapItem = new MapItem { Address = "1122 Elm Street", 
           Html="<p>different html</p>" }; 

將成爲:

firstMapItem.Address == "1122 Elm Street"; 
firstMapItem.Html == "<p>some html</p><p>different html</p>"; 

secondMapItem.Address == "1122 Elm Street"; 
secondMapItem.Html == "<p>some html</p><p>different html</p>"; 

這是我到目前爲止已經試過:

  foreach (MapItem item in mapItems) 
      { 
       var sameAddress = from m in mapItems 
            where m.Address == item.Address 
            select m; 

       if (sameAddress.Count() > 1) 
       { 
        //tried inserting -> item.Html = ""; right here as well 
        foreach (MapItem single in sameAddress) 
        { 
         item.Html += single.Html; 
        } 
       } 
      } 

我可能會讓它比需要的更復雜。

在此先感謝。

+0

如果你通過Linq組地址,當地址相同時,你將得到一個項目。你想要嗎?還是你需要物品,但都是一樣的? – 2011-04-06 21:16:58

+0

是的,我需要兩個項目。 – 2011-04-06 22:00:37

回答

2

如果group by地址,您將結束與只有一個項目,當你有項目具有相同的地址。如果沒問題,請聯繫Group By然而,如果你需要的所有原始項目,與HTML級聯,你應該做的那樣:

var newMapItems = mapItems 
    .Select(mi => new MapItem() { Address = mi.Address, 
            Html = mapItems.Where(mi2 => mi2.Address == mi.Address) 
               .Select(mi3 => mi3.Html) 
               .Aggregate((acc, html) => acc += html) 
           } 
      ); 
3

在組中使用分組上的地址,然後就string.Join在HTML中,所有的項目產生一個新的MapItem

var resultList = mapItems.GroupBy(m => m.Address) 
         .Select(g => new MapItem() { Address = g.Key, Html = string.Join("", g.Select(x => x.Html)) }) 
         .ToList(); 

編輯:

一樣提出這樣的其他解決方案遠遠高於此方法會刪除重複 - 這似乎並不是你想要的 - 在創建一個不是重複數據刪除的列表的解決方案下面(這樣會產生2個樣本輸入項)

var resultList = mapItems.GroupBy(m => m.Address) 
         .Select(g => g.Select(item => new MapItem() { Address = g.Key, Html = string.Join("", g.Select(x => x.Html)) })) 
         .SelectMany(x=> x) 
         .ToList(); 
+0

+1這一個也適用,但是我有可能需要添加更多的屬性,這些屬性對於MapItem類中的每個項目都是唯一的,而@Adriano的解決方案似乎更容易保留其他屬性。謝謝 – 2011-04-06 22:06:49

5

您可以通過Address然後組串聯的Html值:

var results = from m in mapItems 
       group m by m.Address into ms 
       select new MapItem 
       { 
        Address = ms.Key, 
        Html = string.Concat(ms.Select(m => m.Html)) 
       }; 
0

您可以用GroupBySelect做到這一點:

var result = items 
     .GroupBy(m => m.Address, m => m.Html) 
     .Select(g => new MapItem() {Address = g.Key, Html = string.Concat(g.Select(h => h))}); 
0

此代碼應與附加價值更新現有的對象。

foreach (MapItem item in mapItems) 
      { 

       var sameAddress = from m in mapItems 
            group m by m.Address into ms 
            select string.Join("", ms.Select(e => e.Html).ToArray()); 

       foreach (string concatHtml in sameAddress) 
       { 
        item.Html = concatHtml; 
       } 

      }