c# - 相交未给出预期结果

标签 c# .net linq

在下面的代码中,如果我遍历 L3,我希望有 2 个可用结果。然而它只有一个结果,那个结果是 id = 9 的 objTest。我认为它应该是一个有两个 objtest 的 Id = 9 和 Id = 10 的结果集。

class Program
{
public class objTest 
{
    public int Value { get; set; }
    public bool On  { get; set; }
    public int Id { get; set; }
}
class PramComp : EqualityComparer<objTest>
{
    public override bool Equals(objTest x, objTest y)
    {
        return x.Value == y.Value;
    }
    public override int GetHashCode(objTest obj)
    {
        return obj.Value.GetHashCode();
    }
}
 static void Main(string[] args)
{
    List<objTest> L1 = new List<objTest>();
    L1.Add(new objTest { Value = 1, On = true ,Id =1});
    L1.Add(new objTest { Value = 2, On = false ,Id =2});
    L1.Add(new objTest { Value = 3, On = false, Id = 3 });
    L1.Add(new objTest { Value = 4, On = false ,Id =4});
    L1.Add(new objTest { Value = 5, On = false ,Id =5});

    List<objTest> L2 = new List<objTest>();
    L2.Add(new objTest { Value = 6, On = false ,Id =6});
    L2.Add(new objTest { Value = 7, On = false ,Id=7});
    L2.Add(new objTest { Value = 8, On = false,Id =8 });
    L2.Add(new objTest { Value = 1, On = true,Id =9 });
    L2.Add(new objTest { Value = 1, On = true, Id =10 });

    var L3 = L2.Intersect(L1, new PramComp());

}
}

所以如果我想返回 Id=9 和 Id=10 这两个结果,我的代码就出错了。 有人能告诉我我的错误在哪里吗?

最佳答案

Enumerable.Intersect旨在生产:

the set intersection of two sequences.

“集合”不允许重复值,这意味着您只会获得两个值之一。

如果你想返回匹配的两个,你可以使用:

var L3 = L2.Where(item => L1.Any(one => one.Value == item.Value));

这将遍历 L2 集合并找到在 L1 中具有任何匹配值的所有项目,但保留重复项。 p>

关于c# - 相交未给出预期结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19146081/

相关文章:

c# - 通用扩展方法测试

c# web api 2传递字典来上传端点

c# - VS2013 Intellisense 不断停止工作

c# - AJAX HtmlEditorExtender 并从文本框中获取文本?

c# - 哪种 IEnumerable To a List 方式更好?

c# - 如何使用 dotnetcore 命令行生成 Controller

c# - LINQ 的左外连接运行时错误

c# - DateTime.TryParse 如何知道日期格式?

c# - LINQ(或)在循环中使用处理?选择什么?

c# - Linq-To-SQL 中的 Hacker News 风格排序算法