使用 LINQ 比较列表并返回常见对象

本文关键字:返回 常见 对象 列表 LINQ 比较 使用 | 更新日期: 2023-09-27 17:50:24

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication5
{
    class Program
    {
        static void Main(string[] args)
        {
            List<Customer> custList = new List<Customer>();
            custList.Add(new Customer { Name = "P1" });
            custList.Add(new Customer { Name = "P2" });
            custList.Add(new Customer { Name = "P3" });
            custList.Add(new Customer { Name = "P4" });
            custList.Add(new Customer { Name = "P5" });
            List<Customer> vendorList = new List<Customer>();
            vendorList.Add(new Customer { Name = "P1" });
            vendorList.Add(new Customer { Name = "P2" });
            //var v = custList.SelectMany(

        }
    }
    public class Customer
    {
        public string Name { get; set; }
    }
}

我如何应对这两个列表并仅找到客户列表和供应商列表中的客户?

使用 LINQ 比较列表并返回常见对象

理想

情况下,让你的Customer类覆盖GetHashCodeEquals(更好的是,实现IEquatable<Customer>(。然后你可以使用:

var customerVendors = custList.Intersect(vendorList);

否则,您将实现一个IEqualityComparer<T>来比较客户的平等性(例如,按名称,但您可以选择其他比较(,然后使用:

var customerVendors = custList.Intersect(vendorList, new CustomerComparer());

请注意,它们都将返回 IEnumerable<Customer> ,这将被延迟计算。有时这就是你想要的,但如果你真的需要一个List<Customer>,只需在最后打电话给ToList(),例如

var customerVendors = custList.Intersect(vendorList).ToList();

从评论到另一个答案:

Intersect 预计这两个列表都 相同类型。如果他们不是 相同的类型,如果属性名称为 两个列表中不同?如何使用 在这里选择许多

在这种情况下,您可能希望使用 Join .如

var result = from item1 in list1
             join item2 in list2
             on item1.Foo equals item2.Bar
             select new { item1, item2 }; // select whatever you need in the resultset

如果您的 Customer 类实现了"类似值"Equals()您可以执行以下操作:

var inbothLists = custList.Intersect(vendorList).ToList();

否则,您可以使用传递自定义IEQualityComparer的重载,您可以在单独的类中实现(即 CustomerComparer ( :

var inbothLists = custList.Intersect(vendorList, new CustomerComparer())
                          .ToList();

使用 Intersect 方法。

var commonList = custList.Intersect(vendorList);

您所需要的只是IEqualityComparer,以根据名称进行比较。

var both  = (from a  in custList 
             join b in vendorList on a.Name equals b.Name 
             select a);