我有两个班级:
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;
谢谢!
答案 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提供新的过滤子集合。
根据具体情况,在这里使用一些递归并深度克隆整个树可能是谨慎的,但是如果不了解更多有关此语句的代码,很难说出适合任何给定场景的内容。