如何更新C#中List <>中的对象

我有一个List<>自定义对象.

我需要通过一些唯一的属性在此列表中找到一个对象,并更新此对象的另一个属性.

最快的方法是什么?

 

Car*_*ten  88

 

使用Linq查找您可以执行的对象:

var obj = myList.FirstOrDefault(x => x.MyProperty == myValue);
if (obj != null) obj.OtherProperty = newValue;

但在这种情况下,您可能希望将List保存到Dictionary中并使用它代替:

// ... define after getting the List/Enumerable/whatever
var dict = myList.ToDictionary(x => x.MyProperty);
// ... somewhere in code
MyObject found;
if (dict.TryGetValue(myValue, out found)) found.OtherProperty = newValue;

 

  • 因为你有一个自定义对象列表(假设它是一个类而不是结构),你正在处理一个引用类型,它将是对该对象的引用,修改它将"持久" - 它将修改对象集合. (20认同)
  • 谢谢CKoenig,这会得到对'obj`或值(副本)的引用吗?换句话说,列表中的对象会改变吗? (4认同)
  • 我认为如果对象是struct类型,这将不起作用,使它成为一个类:) (4认同)
  • @CKoenig - 它不适用于结构,在下面添加了一个响应代码示例来演示 (2认同)

Mat*_*rts  23

 

只是为了补充CKoenig的回应.只要您正在处理的类是引用类型(如类),他的答案就会起作用.如果自定义对象是一个结构体,这是一个值类型,结果.FirstOrDefault会给你一个本地副本,这意味着它不会持久存回到集合中,如下例所示:

struct MyStruct
{
    public int TheValue { get; set; }
}

测试代码:

List<MyStruct> coll = new List<MyStruct> {
                                            new MyStruct {TheValue = 10},
                                            new MyStruct {TheValue = 1},
                                            new MyStruct {TheValue = 145},
                                            };
var found = coll.FirstOrDefault(c => c.TheValue == 1);
found.TheValue = 12;

foreach (var myStruct in coll)
{
    Console.WriteLine(myStruct.TheValue);
}
Console.ReadLine();

输出为10,1,145

将结构更改为类,输出为10,12,145

HTH

 


Eri*_*rix  14

 

或没有linq

foreach(MyObject obj in myList)
{
   if(obj.prop == someValue)
   {
     obj.otherProp = newValue;
     break;
   }
}

 

  • @Burjua感觉是我们可以看到foreach块中发生的实际循环,而在Linq/Lambda中我们没有,所以我们假设foreach更慢并试图避免它.现实是foreach/for/while循环要快得多. (6认同)
  • 如果有任何差异,linq版本可能会更慢. (5认同)
  • 是的,这是显而易见的答案,但我不想使用 foreach,我想这是最慢的方法 (2认同)

BJ *_*tel  8

 

也可以尝试。

 _lstProductDetail.Where(S => S.ProductID == "")
        .Select(S => { S.ProductPcs = "Update Value" ; return S; }).ToList();

 

  • 这适用于列表或数组,但不适用于IEnumerable (3认同)

cod*_*key  6

 

var itemIndex = listObject.FindIndex(x => x == SomeSpecialCondition());
var item = listObject.ElementAt(itemIndex);
item.SomePropYouWantToChange = "yourNewValue";

 

  • 无需从列表中删除对象并重新插入它(非常低效)。对象是引用类型。一旦获得了对象的引用,只需更新该对象,因为它是一个并且与列表中的对象相同。 (2认同)

小智  5

 

您可以执行以下操作:

if (product != null) {
    var products = Repository.Products;
    var indexOf = products.IndexOf(products.Find(p => p.Id == product.Id));
    Repository.Products[indexOf] = product;
    // or 
    Repository.Products[indexOf].prop = product.prop;
}
 

 转 https://qa.1r1g.com/sf/ask/503301151/

posted @   dreamw  阅读(3229)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
历史上的今天:
2021-08-03 英语老是学不好,试试我的小方法
2021-08-03 技能篇:git的简易教程
2021-08-03 【系统学习ES6】第一节:新的声明方式
2021-08-03 【进阶之路】动态代理与字节码生成
2021-08-03 如何写好技术文档——来自Google十多年的文档经验
2021-08-03 谈谈 C++ STL 中的迭代器
2021-08-03 几百行代码写个Mybatis,原理搞的透透的!
点击右上角即可分享
微信分享提示