使用 linq 更新对象 属性
updating an object property with linq
我已经创建了一个对象,遗憾的是我无法弄清楚如何创建一个带有散列键的 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 字符串,一个 quantityShipped 的 int 值,本质上是 value1,以及一个 int 值quantityOrdered,本质上是value2)?
你能不能不要做这么简单的事情:
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);
}
首先。 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
不会 return 第二个对象或类似的东西。如果它找到匹配的对象,您将获得指向该对象的指针。更改给定对象的属性将完全按照您的要求进行。
我已经创建了一个对象,遗憾的是我无法弄清楚如何创建一个带有散列键的 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 字符串,一个 quantityShipped 的 int 值,本质上是 value1,以及一个 int 值quantityOrdered,本质上是value2)?
你能不能不要做这么简单的事情:
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);
}
首先。 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
不会 return 第二个对象或类似的东西。如果它找到匹配的对象,您将获得指向该对象的指针。更改给定对象的属性将完全按照您的要求进行。