根据对象变量搜索对象列表

Posted

技术标签:

【中文标题】根据对象变量搜索对象列表【英文标题】:Search list of objects based on object variable 【发布时间】:2011-03-10 10:03:09 【问题描述】:

我有一个对象列表。这些对象具有三个变量,ID、名称和值。此列表中可能有很多对象,我需要根据 ID 或名称找到一个,并更改值。 示例

class objec

    public string Name;
    public int UID;
    public string value;

List<objec> TextPool = new List<objec>();

如何在 TextPool 中找到名称为“test”的条目并将其值更改为“Value”。 真正的程序有更多的搜索选项和需要更改的值,所以我不能只使用字典(尽管名称和 UID 或唯一标识符)。 任何帮助都会很棒

【问题讨论】:

【参考方案1】:

你可以使用 LINQ 找到它,然后直接更改元素:

var item = TextPool.FirstOrDefault(o => o.Name == "test");
if (item != null)
       item.value = "Value";

如果您想更改所有匹配的元素,您甚至可以这样做:

TextPool.Where(o => o.Name == "test").ToList().ForEach(o => o.value = "Value");

但是,我个人宁愿将其拆分,因为我觉得第二个选项可维护性较差(执行直接对查询结果“闻”起来的副作用的操作)...

【讨论】:

调用 .ToList() 只是为了使用 ForEach 扩展对我来说更臭。 @Joel:ForEach 不是扩展;)但是,是的,第二种情况对我来说也很奇怪——但我想我也会把它列为一个选项......跨度> @Joel:您删除我的显式声明并放入 var 有什么原因吗? “objec”是 OP 的类名,不是错字... @Reed:第二个例子的另一个选择是改用TextPool.FindAll(o =&gt; o.Name == "test").ForEach(o =&gt; o.value = "Value"); @Reed - 它看起来 像一个错字,所以我更改了它以消除任何混淆。如果你想把它放回去,我不在乎。【参考方案2】:
var find = TextPool.FirstOrDefault(x => x.Name == "test");
if (find != null)

    find.Name = "Value";

【讨论】:

【参考方案3】:

听起来像是LINQ 的工作!

var matchedObject =
   from t in TextPool
   where t.UName == "test"
   select t;

这是假设您的搜索是在代码中定义的。如果您的代码由 UI 驱动,您可能只需要进行线性迭代。要搜索所有可能的属性,而不使用索引,它不会变得更快。

[ 编辑:被打败了,但留下这个作为不同语法的例子,加上一个链接]

【讨论】:

【参考方案4】:
List<objec> TextPool = new List<objec>();
objec found = TextPool.FirstOrDefault(item => item.Name == "test");
if (found != null) found.value = "Value";

如果您要执行多次查找,您可以将结果缓存在多个 Dictionary 实例中(如果键不唯一,则为 Lookup 实例)。

【讨论】:

以上是关于根据对象变量搜索对象列表的主要内容,如果未能解决你的问题,请参考以下文章

使用 React Hooks 根据搜索输入值重新加载对象数组

如何使用以下代码根据实例变量对对象数组进行升序排序

Linq通过搜索关键字从对象的关系列表中选择对象

根据另一个对象列表检查对象列表

核心数据,根据对象自身属性搜索对象

根据JAVA列表内对象的属性将新对象添加到对象列表中