【问题标题】:Get an object from multiple List<T> lists with a specific id从具有特定 id 的多个 List<T> 列表中获取对象
【发布时间】:2015-10-13 16:38:54
【问题描述】:

C# 中,如果我有多个List&lt;T&gt; 列表,其中列表中的每个项目都继承自具有id 属性的接口,那么检索具有特定@987654326 的对象的最佳方法是什么@?

所有ids 都是唯一的,所有列表都存储在一个对象中。

我目前正在考虑为每个列表写一段Find的代码,如果返回的对象不为null,那么返回的对象就是带有id的对象。

有没有更好的方法来做到这一点?

提醒一下,这个问题是关于如何在多个列表中查找对象,而不是在单个列表中查找对象的代码。

【问题讨论】:

标签: c# list generics


【解决方案1】:

使用 Linq 怎么样:

var result = list.First(x => x.id == findThisId);

【讨论】:

    【解决方案2】:
    var result =
     new [] { list1, list2, list3, ... }
     .Select(list => list.FirstOrDefault(x => x.id == findThisId))
     .First(x => x != null);
    

    您也可以将多个列表视为一个串联列表:

    var result =
     new [] { list1, list2, list3, ... }
     .SelectMany(x => x) //flatten
     .FirstOrDefault(x => x.id == findThisId);
    

    【讨论】:

      【解决方案3】:

      您可以创建一个列表列表,并使用 LINQ 的 SelectMany 搜索它:

      这是一个示例设置:

      interface IId {
          int Id {get;}
      }
      class A : IId {
          public int Id {get;set;}
          public override string ToString() {
              return "A"+Id;
          }
      }
      class B : IId {
          public int Id {get;set;}
          public override string ToString() {
              return "B"+Id;
          }
      }
      

      IIdAB实现的通用接口。现在你可以这样做了:

      var a = new List<A> {new A {Id=5}, new A {Id=6}};
      var b = new List<B> {new B {Id=7}, new B {Id=8}};
      var all = new List<IEnumerable<IId>> {a, b};
      

      all 是一个列表,其中包含 IId 的不同子类型的列表。由于泛型的协方差规则,它需要声明为IEnumerables 的列表。

      现在您可以通过Id 搜索all,如下所示:

      var item5 = all.SelectMany(list => list).FirstOrDefault(item => item.Id == 5);
      

      Demo.

      【讨论】:

        【解决方案4】:
        var result = list.Where(i => i.Id == id).FirstOrDefault();
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-09-13
          • 1970-01-01
          • 2023-03-09
          • 2015-03-08
          • 2020-09-10
          • 2017-07-03
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多