2011-04-06 62 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; 
       } 

      }