使用linq查询连接两个列表-C#

使用linq查询连接两个列表-C#,c#,linq,list,join,linq-query-syntax,C#,Linq,List,Join,Linq Query Syntax,我有一个任务,我必须加入两个相同类型的列表(客户)。他们有相似的条目,我必须避免重复 这是我的客户课程: class Customer { private String _fName, _lName; private int _age, _cusIndex; private float _expenses; public Customer(String fName, String lName, int age, float expenses, int cusIndex) {

我有一个任务,我必须加入两个相同类型的列表(客户)。他们有相似的条目,我必须避免重复

这是我的客户课程:

class Customer
{
  private String _fName, _lName;
  private int _age, _cusIndex;
  private float _expenses;

  public Customer(String fName, String lName, int age, float expenses, int cusIndex)
  {
    this._fName = fName;
    this._lName = lName;
    this._age = age;
    this._expenses = expenses;
    this._cusIndex = cusIndex;
  }
}
因此,我有两个名为
customers1
customers2
列表。我需要在不使用Collections方法(如
customer1.Union(customer2.ToList();
的情况下连接这两种方法,但使用Linq查询)

下面是我写的Linq查询

var joined = (from c1 in customers1
              join c2 in customers2
              on c1.CusIndex equals c2.CusIndex
              select new {c1, c2});

但这给了我出现在两个列表中的成员。但我需要所有成员,不重复。有什么解决方案吗?

看起来没有与
Union
方法等价的查询。您需要在方法链调用或查询中使用此方法

如果查看返回两个序列的集合并集,您将看到以下正式查询:

var infoQuery =
    (from cust in db.Customers
    select cust.Country)
    .Union
        (from emp in db.Employees
        select emp.Country)
;
因此,在您的案例中只有两种选择:

  • 方法链:

    var joined = customers1.Union(customers2);
    
  • LINQ查询

    var joined = (from c1 in customers1
                  select c1)
                 .Union
                     (from c2 in customers2
                      select c2);
    

  • 为什么不使用Distinct过滤掉重复项

     var joined =  (from c1 in customers1
              join c2 in customers2
              on c1.CusIndex equals c2.CusIndex
              select new {c1, c2}).Distinct();
    

    Microsoft.Ajax.Utilities
    中有一个很好的函数。它有一个名为
    DistinctBy
    的函数,它可能与您的情况更相关。

    1.覆盖和在您的
    Customer
    类中(以反映两个客户被认为是平等的,如果他们的
    CusIndex
    相等的话)。2.
    var joined=customers1.Concat(customers2.Distinct()
    似乎没有与
    Union
    方法等价的查询。不使用
    Union
    方法的原因是什么?@Corak是的。我已经这样做了。但问题是,此查询返回两个列表中的客户。但我需要everyone@ThisaruGuruge-基本上只是枚举整个第一个可枚举项然后是整个第二个枚举。然后基本上跳过所有已经生成的元素。这就是给你你想要的:每个人(从两个列表中),但只有一次。但是因为似乎对你有用(我猜它在引擎盖下也是这样),使用它。:)是的,根据它。相关的实现(查找
    UnionIterator
    ):
    Set Set Set=new Set(comparer);foreach(TSource元素在第一个中)if(Set.Add(element))产生返回元素;foreach(TSource元素在第二个中)if(Set.Add(element))产生返回元素;
    我使用了它。但是当我试图使用
    ToList()将其转换为新列表时
    方法,它给我错误。
    无法隐式转换类型
    这类似于.ToList()将为您提供一个匿名集合。我对您试图实现的目标感到困惑。您无法将匿名类型强制转换为已知类型。正如我提到的,我需要在没有重复元素的情况下加入两个列表。这是分配的一部分!然后您必须
    Union
    合并两个集合,然后
    Distinct
    进行筛选重复。或者你可以使用
    相交
    ,然后使用
    联合
    ,然后使用
    除了
    。有很多方法可以做到这一点。谢谢你的帮助。我尝试了@yeldarKurmangaliyev提供的方法并成功了