假设我有两个带有此类的列表对象
class Sku
{
public string skuId { get; set; }
public int qty { get; set; }
public string city { get; set; }
}
class SkuWithCity
{
public string skuId { get; set; }
public string city { get; set; }
}
我有两个包含对象的列表:
List<Sku> skuList = new List<Sku>();
List<SkuWithCity> skuListWithCity = List<SkuWithCity>();
想象一下,在第一个列表(skuList)中,属性&#34; City&#34;每个对象的值为null。
我想要做的是,使用linq,选择具有相同skuId的sku对象并添加城市。有些人喜欢:
var result = from skuElements in skuList
from skuWCity in skuListWithCity
where skuElements.sku == skuWCity.sku
select skuElements
{
skuElements.city = skuWCity.city,
};
获取整个对象,而不仅仅是城市
为了获得:
|对象|数量|市 | ---- | ---- | | AAA | 2 |巴拿马|
| BBB | 5 |里约热内卢|
这是否可能,获取整个对象并修改一个或多个属性?
更新:在现实生活中,我试图复制的对象有很多成员,这就是为什么我要复制&#34;复制&#34;列表A的de object,只使用列表B的匹配对象修改一些属性。
答案 0 :(得分:1)
如果您只想更新现有对象而不是投影到一组新对象,那么首先使用连接来获取匹配项。
var result = from skuElement in skuList
join skuWCity in skuListWithCity
on skuElements.skuId == skuWCity.skuId
select skuElements
{
skuElement,
skuWCity
};
然后迭代它们并进行更新。
foreach(var x in result)
{
x.skuElement.City = x.skuWCity.City;
}
请注意,这不会处理任何一个列表中的多个项目在另一个列表中具有多个匹配项的情况。我假设这些列表已经有了一对一的匹配。
或者你也可以使用字典。
var cities = skuListWithCity.ToDictionary(s => s.skuId, s => s.City);
foreach(var s in skuList)
{
s.City = cities[s.skuId];
}
请注意,如果skuId
中存在重复skuListWithCity
或skuId
中的skuList
不在skuListWithCity
答案 1 :(得分:0)
您可以使用join
,然后对结果集进行投影,如下所示:
var result = from skuElements in skuList
join skuWCity in skuListWithCity
on skuElements.skuId equals skuWCity.skuId
select new Sku
{
skuId = skuElements.skuId,
qty = skuElements.qty,
city = skuWCity.city,
};