Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Linq过滤器IEnumerable与另一IEnumerable的比较_C#_Linq - Fatal编程技术网

C# Linq过滤器IEnumerable与另一IEnumerable的比较

C# Linq过滤器IEnumerable与另一IEnumerable的比较,c#,linq,C#,Linq,我有两门课 public class ClassA { public int Id { get; set; } public string Name { get; set; } } 及 我试图用a类列表过滤B类列表 void Main() { var ListA = new List<ClassA>(); var a1 = new ClassA() {Id=1, Name = "A1"}; var a2 = new Clas

我有两门课

public class ClassA
{
    public int Id { get; set; }
    public string Name { get; set; }
}

我试图用a类列表过滤B类列表

void Main()
    {

    var ListA = new List<ClassA>();
        var a1 = new ClassA() {Id=1, Name = "A1"};
    var a2 = new ClassA() {Id=2, Name = "A2"};
    var a3 = new ClassA() {Id=3, Name = "A3"};
    ListA.Add(a1);
    ListA.Add(a2);
    ListA.Add(a3);

    var FilterListA = new List<ClassA>();
    FilterListA.Add(a1);
    FilterListA.Add(a2);


    var ListB = new List<ClassB>();

    var b1 = new ClassB() {Id=1, Name="B1" ,ClassA= a1};
    var b2 = new ClassB() {Id=1, Name="B1", ClassA= a2};
    var b3 = new ClassB() {Id=1, Name="B1", ClassA= a3};
    var b4 = new ClassB() {Id=1, Name="B1", ClassA= a3};

    ListB.Add(b1);
    ListB.Add(b2);
    ListB.Add(b3);
    ListB.Add(b4);
但是我想做一些像这样的事情。。。但我不知道怎么做

Console.WriteLine(ListB.Where(o => o.ClassA IsIncluded In FilterListA));
}

我尝试使用Contains,但没有成功。谢谢

这应该可以:

ListB.Where(x=>FilterListA.Any(y=>y==x.ClassA));
它从ListB中获取在FilterListA中具有等效元素的所有元素。若列表元素中包含的ClassA对象列在FilterListA中,则返回该对象

编辑: 正如gunr2171所说,您可以使用
Contains

ListB.Where(x=>FilterListA.Contains(x.ClassA));
这应该是有效的:

ListB.Where(x=>FilterListA.Any(y=>y==x.ClassA));
它从ListB中获取在FilterListA中具有等效元素的所有元素。若列表元素中包含的ClassA对象列在FilterListA中,则返回该对象

编辑: 正如gunr2171所说,您可以使用
Contains

ListB.Where(x=>FilterListA.Contains(x.ClassA));

或者你可以使用
Contains
短语“big-O”对你来说有什么意义吗?@KennetBelenky比你想象的要多,但是没有人说它应该针对时间复杂性进行优化。这是一种有效的linq方法,仅此而已。@wudzik假设你是一名六年级的商店老师。你有没有教孩子们如何在锯片护罩被移除、棘爪被禁用的情况下使用台锯?当与初学者打交道时,总是,总是,总是,教他们如何正确地做。后来,他们可以自己发现如何以及何时做错事情。或者,你可以使用
包含
短语“big-O”对你有什么意义吗?@KennetBelenky比你想象的要多,但没有人说它应该针对时间复杂性进行优化。这是一种有效的linq方法,仅此而已。@wudzik假设你是一名六年级的商店老师。你有没有教孩子们如何在锯片护罩被移除、棘爪被禁用的情况下使用台锯?当与初学者打交道时,总是,总是,总是,教他们如何正确地做。稍后,他们可以自己发现如何以及何时做错事情。但是您的
Join
方法比您希望的
Where
with contains(或
Any
)更有效。这就是我想弄明白的。我必须说,加入非常快。我想我想知道做同一件事的不同方法,即使这会让我损失几点声誉。2000万次包含迭代大约需要22秒。。使用join需要41秒。。。。任何一个都需要43秒。所以我想contains更快…使用有意义的性能测试。藏品的大小很重要。在我上面链接的问题中,我发布了一些测试。好的观点。。。。我会记住这一点,但是您的
Join
方法比您想要的
Where
with contains(或
Any
)更有效。这就是我想弄明白的。我必须说,加入非常快。我想我想知道做同一件事的不同方法,即使这会让我损失几点声誉。2000万次包含迭代大约需要22秒。。使用join需要41秒。。。。任何一个都需要43秒。所以我想contains更快…使用有意义的性能测试。藏品的大小很重要。在我上面链接的问题中,我发布了一些测试。好的观点。。。。我会记住的