【问题标题】: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 或唯一标识符)。 任何帮助都会很棒

【问题讨论】:

    标签: c# search list


    【解决方案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 实例)。

        【讨论】:

          猜你喜欢
          • 2013-06-25
          • 2011-09-08
          • 1970-01-01
          • 1970-01-01
          • 2018-08-18
          • 1970-01-01
          • 2012-05-19
          • 2013-03-28
          • 1970-01-01
          相关资源
          最近更新 更多