列表列表Linq

时间:2017-05-18 13:27:46

标签: c# linq

我有两个班级:

public class One
{
    string PropertyA;
    string PropertyB;
    List<Two> ListOfClassTwo;
}

public class Two
{
    string MyString1;
    string MyString2;
}

如何通过以下方式在一个查询中过滤掉列表:

我仍然希望能够访问Class One Properties; 我想通过说MyString1 ==“Foo”

来过滤ListOfClass2

所以我基本上想要保留第一类本身的类结构,但是根据我的喜好过滤ListOfClass2。

我应该指出,第一类实际上本身就是一个枚举 IEnumerable&lt;一个&gt;

谢谢!

1 个答案:

答案 0 :(得分:0)

根据我的理解,您只想过滤内部列表,并将所有项目保留在外部列表中,如果是这样的话......

var listOfOnes = new List<One>() // assume this is populated with some stuff

var result = listOfOnes.Select(i => { 
     i.ListOfClassTwo = i.ListOfClassTwo
        .Where(j => j.MyString1 == "Foo")
        .ToList();
    return i;
});

......应该做你想做的事。

关于改变LINQ查询的评论情况的详细说明......

如果将listOfOnes传递给执行上述操作的方法,那么父范围(调用方法)可能会以某种方式被破坏,因为该范围不期望在该上下文中过滤掉其他项目。< / p>

更好的解决方案可能是......

var result = listOfOnes.Select(i => { 
     var r = i.Clone();  
     r.ListOfClassTwo = i.ListOfClassTwo
        .Where(j => j.MyString1 == "Foo")
        .ToList();
    return r;
});

这将使用复制ctor复制克隆方法中“One”实例变量i上的标量唯一道具,然后为ListOfTwo属性中的新One提供新的过滤子集合。

根据具体情况,在这里使用一些递归并深度克隆整个树可能是谨慎的,但是如果不了解更多有关此语句的代码,很难说出适合任何给定场景的内容。