连接项列表中的属性

时间:2011-04-06 21:00:03

标签: c# .net linq loops

我遇到了一小段代码问题。

我有一个MapItem类的列表,其中包含一些属性,Address和Html,我需要使用相同的Address属性连接每个项目的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;
                    }
                }
            }

我可能会让它变得比它需要的更复杂。

提前致谢。

5 个答案:

答案 0 :(得分: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))
              };

答案 1 :(得分: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个项目)< / p>

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();

答案 2 :(得分: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 :(得分: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))});

答案 4 :(得分: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;
                }

            }