【问题标题】:Assign Values to object properties by Id按 Id 为对象属性赋值
【发布时间】:2015-10-17 10:26:02
【问题描述】:

我有一个用于保存值的对象的全局列表,值和 ID 将被解析到 ObjectManager 函数中,ID 只能是列表中所述的内容。我希望函数更新与Id 对应的值。

最初我尝试使用未更新列表中对象的 foreach 循环。使用下面的代码确实会更新列表中的对象,但它只检查解析的 id,我现在正在尝试使用 switch 语句,早期。

实现我想要做的最好的方法是什么?

示例代码:

public List<Object> obj = new List<Object>
            {
                new Object { id = 4, val = 20 },
                new Object { id = 1, val = 34 },
                new Object { id = 16, val = 27 },
                new Object { id = 9, val = 36 }
            };

public void ObjectManager(List<Object> myobj, int id, int val)
{
    int i = 0;
    int j = 0;
    while (i < myobj.Count)
    {
        if(myobj[i].id == id)
        {
            j = myobj[i].val;
            myobj[i].val = j + val; 
        }
    }
}

【问题讨论】:

  • Foreach 将集合设为只读。所以你可以使用 foreach 循环更新集合
  • @Turbulence ,你的意思是说不能使用 foreach 循环更新集合。
  • @learningNew - 在这种情况下不是。我的意思是说 Foreach 循环使收集成为只读
  • 我不明白你的实际问题是什么,你是在问如何用 switch 语句来做到这一点?
  • 为什么 j = myobj[i].val; myobj[i].val = j + val;但不是 myobj[i].val = myobj[i].val + val ?

标签: c#


【解决方案1】:

您可以使用FirstOrDefault()选择要更新的项目

var variable = myobj.FirstOrDefault(o=&gt;o.id = "YOUR_ID"

FirstOrDefault()如果没有找到该项目则返回null,因此我们需要在更新项目之前检查是否为null

if (variable != null) variable.val = YOUR_VALUE

【讨论】:

  • 酷 - 看起来不错,应该试一试,这会否定使用任何循环。还应该更新任何属性 ID
  • @SelrekJohn:它不会否定循环,FirstOrDefault 基本上是一个循环,它使用提供的谓词检查每个项目,并在找到某些内容时停止。如果避免循环很重要(例如,因为您的集合很大并且您经常这样做),那么这不是您的解决方案。
  • 对不起,写得不好,是的,它仍然是一个循环,但我正在做的(错误地)是一个 while 循环,然后是一个 foreach 循环等等。
  • 正如@Chris 所说,这仍然是一个循环,只是使用谓词编写它们的一种优雅方式。如果您担心循环迭代次数过多,Dictionary 将是更好的选择
【解决方案2】:

您应该为此使用Dictionary

您会在 Dictionary 中找到许多与添加或更新相关的解决方案。喜欢thisthis

【讨论】:

  • 通常是的,但是我保持这个简单,会有更多的属性,我只是想要一个简单的例子。
  • 请看Dictionary,你也可以将Object作为值参数,所以你可以根据需要设计Dictionary
  • 如果您想通过某种 id 查找对象,那么字典正是您想要的。如果每个 id 有多个属性,则创建一个属性对象(听起来你已经拥有)并将其存储在每个 id 中。
猜你喜欢
  • 1970-01-01
  • 2014-12-01
  • 1970-01-01
  • 2016-05-07
  • 2012-07-11
  • 2014-03-24
  • 1970-01-01
  • 2014-12-19
  • 1970-01-01
相关资源
最近更新 更多