【问题标题】:Find all items whose collection property contains items in another list查找其集合属性包含另一个列表中的项目的所有项目
【发布时间】:2013-05-15 15:33:50
【问题描述】:

我有一个对象 Foo 的集合,它的 ICollection 属性包含一个 People 对象列表。

public class Foo
{
  public int Id { get; set; }
  public string Name { get; set; }
  public ICollection<Person> People { get; set; }
}

我还有另一个人员列表。

ICollection<Person> OtherPeople

我需要找到所有对象 Foo,其中 People 包含来自 OtherPeople 的任何人。 是否有接受集合的 .Contains 版本? 比如:

var result = from f in FooCollection
             where f.People.Contains(otherPeople)
             select f;

如果这很重要,我将它与实体框架一起使用。

【问题讨论】:

    标签: linq entity-framework


    【解决方案1】:

    您指的是使用 C# Linq 的 Any 方法。

    Any 方法基本上说明该集合(可枚举)中的任何元素是否满足条件,在您的情况下,条件是另一个集合是否包含其中一个元素。

    例如

    public bool HasPeople(ICollection<Person> original, ICollection<Person> otherPeople)
    {
        return original.Any(p => otherPeople.Contains(p));
    }
    

    但是Any 方法返回一个boolean 来说明集合是否有满足条件的Any 元素 - 这并没有告诉我们哪些元素。

    Linq 中另一个值得注意的方法是 Where 为我们提供所有满足条件的元素。

    例如

    public IEnumerable<Person> GetPeople(ICollection<Person> original, ICollection<Person> otherPeople)
    {
        return original.Where(p => otherPeople.Contains(p));
    }
    

    我希望这能让你朝着正确的方向前进。实体框架应该无关紧要,因为它们是可枚举的。差点忘了说 Linq 方法相当简单,所以他们真的不需要在他们自己的方法中。

    【讨论】:

    • 如果我正确理解 LINQ,这将导致 O(n²),这是正确的吗?
    【解决方案2】:

    我最终实现了一个这样的辅助方法:

        public static bool HasElement<T>(ICollection<T> original, ICollection<T> otherCollection)
        {
            return original.Any(otherCollection.Contains);
        }
    

    希望对你有帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-07-12
      • 2018-06-18
      • 2019-03-28
      • 2016-05-16
      • 2021-12-03
      • 2013-04-15
      • 1970-01-01
      相关资源
      最近更新 更多