.NET 6 IntersectBy 和 ExceptBy 示例

.NET 6 IntersectBy and ExceptBy examples

有人可以提供一个关于如何使用 .NET 6 LINQ IntersectByExceptBy 方法的小示例吗? MSDN 没有任何示例,我试过的那个由于 CS0411 错误而无法编译。我试过的例子:

namespace Test
{
    internal struct Example
    {
        public int X { get; set; }
        public int Y { get; set; }

        public override string ToString()
        {
            return $"{X}, {Y}";
        }
    }

    public class Program
    {
        public static void Main()
        {
            var elements = new List<Example>
            {
                new Example { X = 10, Y = 20 },
                new Example { X = 11, Y = 23 },
            };

            var elements2 = new List<Example>
            {
                new Example { X = 10, Y = 12 },
                new Example { X = 44, Y = 20 },
            };


            //ok
            var union = elements.UnionBy(elements2, x => x.X);
            
            //CS0411 - Why ?
            var intersect = elements.IntersectBy(elements2, x => x.X);

            //CS0411 - Why ?
            var except = elements.ExceptBy(elements2, x => x.X);

            Console.ReadKey();
        }
    }
}

虽然 documentation 没有任何示例,它声明 selector 函数应该 select TKey 即第二个集合的类型。以下应该有效:

var intersect = elements.IntersectBy(elements2, x => x);
var except = elements.ExceptBy(elements2, x => x);

虽然我认为这可能更接近你想要的:

var intersect = elements.IntersectBy(elements2.Select(e => e.X), x => x.X);

对于更复杂的类型,您可能需要考虑实现 IEqualityComparer 并使用将一个作为参数的重载。