2017-02-23 100 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