2017-02-23 95 views
0

我已经创建了一个对象,可悲的是我的生活我无法弄清楚如何用散列键创建一个3属性对象(几乎就像字典,而不是键和值,值1和值2)用linq更新对象属性

作为解决方案我在对象列表上使用linq,它工作正常,但我想知道,因为linq是查询语言,您可以更新它的对象而不创建新对象?

我想基本上做到这一点

public void AddLineItemFulFilled(string itemID, int quantityOrdered, int quantityShipped) 
{ 
     if (!LineItems.Any(li => li.LineItemID.Equals(itemID))) 
     LineItems.Add(new LineItemModel(lineItem, quantityOdered, quantityShipped)); 
     else 
     { 
      int matchingItem = 0; 
      foreach(LineItemModel modUpdate in LineItems) 
      { 
       if(modUpdate.LineItemID.Equals(itemID) && matchingItem <= 1) 
       { 
        modUpdate.QauntityShipped += quantityShipped; 
        matchingItem++; 
       } 
      } 
     } 
     else if(modUpdate.LineItemID.Equals(itemID)) 
     LineItems.RemoveAt(LineItems.InexOf(modUpdate)); 

} 

我会得到与此相同的结果?

public void AddLineItemFulFilled(string itemID, int quantityOrdered, int quantityShipped) 
      { 
       if (!LineItems.Any(li => li.LineItemID.Equals(itemID))) 
        LineItems.Add(new LineItemModel(lineItem, quantityOdered, quantityShipped)); 
       else 
        LineItems.FirstOrDefault(li => li.LineItemID.Equals(itemID)).QauntityShipped += quantityShipped; 
      } 

或者是否会使用该ItemID创建第二个LineItemModel对象?这个对象有3个属性,一个ItemID字符串用作事实上的键,一个int值是quantityShipped,本质上是value1,一个int值是quantityOrdered ,本质上是价值2)?

+0

您是否希望'quantityShipped'和'quantityOrdered'参与密钥的唯一性,还是您希望'ItemID'成为密钥? – Tim

+0

只是ITEMID,该quantityShipped是报告后和quantityOrdered是quantityShipped比较,只标注一个项目发运如果该项目完全出货,所以他们并不需要成为任何组合密钥的唯一或部分,只是绑住该项目ID – davidp04

回答

0

你能不能做这样简单的东西:

public class MyObject { 
    public int ItemID { get; set;} 
    public int QuantityShipped { get; set;} 
    public int QuantityOrdered { get; set;} 
} 

public Dictionary<int, MyObject> myDictionary; 
public string Foo(int itemId) { 
    var value = myDictionary[itemId]; 
    return string.Format("Quantity ordered = {0}, quantity shipped = {1}", value.QuantityShipped, value.QuantityOrdered); 
} 
+0

仅供参考,您还可以使用词典>,但它会少可读 – Tim

+0

基本上只是有我的整个对象与我的匹配对象的ITEMID的关键一本字典的价值?这个病可能实际上工作。我要纪念这个解决因为这是我的一个更简单的解决方案,但我会离开命名的问题,因为它是万一有人有大约LINQ和别人一个类似的问题可以回答如果该项目在格兰原始列表editied或克隆在第二个代码片段中。谢谢! – davidp04

+0

有在该解决方案中QuantityShipped属性没有更新所以也许我也许能得到这个问题错了... – Waescher

0

第一。有一个错字Q(au)ntityShipped

二:第二种方法是好的,但尽量避免重复相同的lambda表达式,因为即使语法看起来很短,每一个是(潜在的)一个通过对象的整个列表循环。

我会去这样的:

public void AddLineItemFulFilled(string itemID, int quantityOrdered, int quantityShipped) 
{ 
    var li = LineItems.FirstOrDefault(l => l.LineItemID.Equals(itemID)); 

    if (li == null) 
     LineItems.Add(new LineItemModel(lineItem, quantityOdered, quantityShipped)); 
    else 
     li.QuantityShipped += quantityShipped; 
} 

没有,FirstOrDefault不会返回第二个对象或类似的东西。如果它找到匹配的对象,你会得到一个指针。改变给定对象的属性将完成你想要的。

+0

真棒谢谢 – davidp04

+0

wasnt为你解决? – Waescher

+0

对不起,蒂姆也给了我一个不同方法的解决方案,我不认为它可以让两者兼而有之。它甚至不会让我满意你的答案呢 – davidp04