简体   繁体   English

C#从2个IEnumerable实例创建对象列表,该实例仅包含那些在第二个列表中找到值的对象

[英]C# Create a list of objects from an 2 IEnumerable instances containing only those objects with a value found in the second list

I have 2 different classes: 我有2个不同的班级:

public class ClassOne
{
    public string ClassOneID { get; set; }
    ...
}

public class ClassTwo
{
    public string ClassTwoID { get; set; }
    ...
}

I have IEnumerable instances of each. 我每个都有IEnumerable实例。 I want to return a List<ClassOne> that contains only the ClassOne items whose ClassOneID is equal to the ClassTwoID of a ClassTwo object from the second IEnumerable instance (if that makes sense!). 我想返回一个List<ClassOne>仅包含ClassOne项目,其ClassOneID等于ClassTwoID一个的ClassTwo从第二对象IEnumerable实例(如果是有道理的!)。 I was thinking the following: 我在想以下几点:

var list = new List<ClassOne>();
list.AddRange(classOneEnumerable.Where(o => 
                classTwoEnumerable.Select(c => c.ClassTwoID == o.ClassOneID).First()));

This logic is contained within code that is some days off building/testing, so I am not actually able to run it just yet. 此逻辑包含在可能需要构建/测试几天的代码中,因此我实际上还不能运行它。 I am not sure if what I have come up with is actually correct, and was hoping someone could put me right if I am mistaken. 我不确定我提出的建议是否正确,并希望有人能在我弄错的情况下纠正我。

var list = (from classOne in classOneEnumerable
            from classTwo in classTwoEnumerable
            where classOne.ClassOneID == classTwo.ClassTwoID
            select classOne).ToList();

var list2 = (from classOne in classOneEnumerable
             join classTwo in classTwoEnumerable
             on classOne.ClassOneID equals classTwo.ClassTwoID
             select classOne).ToList();

Both queries will yield the same results. 这两个查询将产生相同的结果。

The existing answers are fine if you can handle O(n 2 ) . 如果您可以处理O(n 2 )那么现有的答案就很好。 Otherwise I would sort the inner values so that you can get n log(n) performance. 否则,我将对内部值进行排序,以便获得n log(n)性能。

Try this 尝试这个

var list = classOneEnumerable.Where(o => classTwoEnumerable
                                  .Any(c => c.ClassTwoID == o.ClassOneID)))
                             .ToList();

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM