【问题标题】:updating an object property with linq使用 linq 更新对象属性
【发布时间】:2017-02-24 05:32:30
【问题描述】:

我已经创建了一个对象,遗憾的是我一生都无法弄清楚如何使用散列键创建一个 3 属性对象(几乎像字典,但不是键和值,而是键、值 1 和值 2 )

作为一种变通方法,我在对象列表上使用 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 value of quantityShipped,本质上是value1,以及一个int value of quantityOrdered,本质上 value2)?

【问题讨论】:

  • 您是希望quantityShippedquantityOrdered 参与密钥的唯一性,还是严格要求ItemID 成为密钥?
  • 只是 itemID,quantityShipped 用于稍后的报告,quantityOrdered 用于与 quantityShipped 进行比较以仅在商品已完全发货时标记已发货,因此它们不需要唯一或部分任何组合键,仅绑定到项目 ID

标签: c# linq collections hashcode


【解决方案1】:

你能不能不做这么简单的事情:

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);
}

【讨论】:

  • 仅供参考,您也可以使用 Dictionary> 但它的可读性会降低
  • 基本上只是将我的整个对象作为字典的值,其键与我的对象的 itemID 匹配?那病态可能真的有效。我将把它标记为已解决,因为这对我来说是一个更简单的解决方案,但我会保留这个问题的名称,以防有人对 linq 有类似的问题,如果该项目在原始列表中被编辑或有人可以回答克隆在第二个代码sn -p。谢谢!
  • 此解决方案中的 QuantityShipped-property 没有更新,所以我可能答错了问题...
【解决方案2】:

首先。 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 不会返回第二个对象或类似的东西。如果它找到匹配的对象,您将获得指向该对象的指针。更改给定对象的属性将完全符合您的要求。

【讨论】:

  • 这不是你的解决方案吗?
  • 是的,但是 Tim 还给了我一个不同方法的解决方案,我认为它不能让 m 标记两者。它甚至不会让我为你的答案投票
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-09-13
  • 2010-09-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-18
  • 1970-01-01
相关资源
最近更新 更多