在linq中选择元素并更改属性

时间:2017-03-28 18:42:25

标签: c# linq

假设我有两个带有此类的列表对象

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的匹配对象修改一些属性。

2 个答案:

答案 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中存在重复skuListWithCityskuId中的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,  
             };