我遇到了一小段代码问题。
我有一个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;
}
}
}
我可能会让它变得比它需要的更复杂。
提前致谢。
答案 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)
您可以使用GroupBy
和Select
:
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;
}
}