【问题标题】:Unable to replace a particular object in a list?无法替换列表中的特定对象?
【发布时间】:2016-06-20 07:14:27
【问题描述】:
SelectedListObjA.Where(x => x.FieldA == "ABC").FirstOrDefault() = ObjA;

SelectedListObjA = new List<ObjType>();
ObjType ObjA = new ObjType();

谁能给我解释一下为什么上面的说法是错误的。它正在抛出The Left hand side of an assignment must be a variable...

【问题讨论】:

  • 我以为FirstOrDefault() 会返回一个对象?
  • 基本上我会在FieldA == 'ABC' 处检索一个obj,并且第一次出现将被ObjA 替换。 ObjA.FieldA 将是例如'CDE'....基本上它是一个不同的对象
  • ObjA = SelectedListObjA.Where(x =&gt; x.FieldA == "ABC").FirstOrDefault()
  • 如果我错了,请纠正我,但您的陈述是仅在我的目标是替换对象时检索对象
  • 当您分配object 时,它将被新的替换。

标签: c# variable-assignment


【解决方案1】:

您从FirstOrDefault 得到的结果是源代码中的第一个元素。所以你得到一个对象。但分配只能在variable, property or indexer 上执行。如果你想替换对象,你可以使用这样的东西:

var tmp = SelectedListObjA.Where(x => x.FieldA == "ABC").FirstOrDefault();
if (tmp != null) { // If tmp is reference type. Would be better to use default()
    var index = SelectedListObjA.IndexOf(tmp);
    SelectedListObjA[index] = ObjA;
}

【讨论】:

    【解决方案2】:

    你不能这样做。

    1. FirstOrDefault 可以返回 null。你认为会发生什么。是否应将值添加到列表中?

    2. 如果 FirstOrDefault 将返回一个对象,它只会是一个新变量中对该对象的引用。对该变量的赋值不会改变列表,而只会改变变量指向的引用。列表将保持不变。

    如果您想替换列表中的某个项目,您需要找到该项目的索引并将该索引处的对象替换为您的新对象。

    var objectToReplace = SelectedListObjA.Where(x => x.FieldA == "ABC").FirstOrDefault();
    if (objectToReplace != null)
    {
        SelectedListObjA[SelectedListObjA.IndexOf(objectToRelplace)] = ObjA;
    }
    else
    {
        SelectedListObjA.Add(ObjA);
    }
    

    干杯

    托马斯

    【讨论】:

      猜你喜欢
      • 2015-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-09
      相关资源
      最近更新 更多