【问题标题】:C# List merging without repeatingC#列表合并不重复
【发布时间】:2011-10-06 01:47:20
【问题描述】:

我的问题是在 cmets 中以下代码的末尾:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;


namespace ConsoleApplication1
{
class MyObj
{
    int m_id;

    public MyObj(int id)
    {
        this.m_id = id;
    }

    public int GetId()
    {
        return this.m_id;
    }
}

class Program
{
    static void Main(string[] args)
    {
        var m0 = new MyObj(0);
        var m1 = new MyObj(1);
        var m2 = new MyObj(2);
        var m3 = new MyObj(3);
        var m4 = new MyObj(4);


        List<MyObj> refList1 = new List<MyObj>()
            {
                m0, m1, m2, m3
            };

        List<MyObj> refList2 = new List<MyObj>()
            {
                m1, m2, m3, m4
            };


        //How to merge refList2 into refList1 without id repeating,
        //so refList1 must be [m0, m1, m2, m3, m4]
    }
}
}

【问题讨论】:

    标签: c# list merge


    【解决方案1】:
    refList1 = refList1.Union(refList2).Distinct.ToList();
    

    【讨论】:

      【解决方案2】:

      你可以使用Union

      看看here

      【讨论】:

        【解决方案3】:

        使用Union Extension method

        var merged = refList2.Union(refList1).ToList();
        

        并定义 Equals/Hashcode 方法。完成此操作后,它将自动删除重复项。

        class MyObj{
             /*your stuff*/
        
             public override bool Equals(object obj)
             {        
                var r_list= obj as MyObj;
                if(r_list == null) return false;
                return this._m_id==r_list.m_id;
             }
        
             public override int GetHashCode()
             {
                return m_id;
             }
        }
        

        【讨论】:

          【解决方案4】:

          您可以使用 LINQ 执行此操作,其中:

          var resultList = refList1.Union(refList2).ToList();
          

          但是,这要求MyObj 实现IEquatable&lt;MyObj&gt;,或者使用Union 的另一个重载,它采用IEqualityComparer&lt;T&gt; 参数。

          第一个解决方案需要进行此更改:

          class MyObj : IEquatable<MyObj>
          {
              int m_id;
          
              public MyObj(int id)
              {
                  this.m_id = id;
              }
          
              public int GetId()
              {
                  return this.m_id;
              }
          
              public bool Equals(MyObj other)
              {
                  if (ReferenceEquals(null, other)) {
                      return false;
                  }
                  if (ReferenceEquals(this, other)) {
                      return true;
                  }
                  return other.m_id == this.m_id;
              }
          
              public override bool Equals(object obj)
              {
                  if (ReferenceEquals(null, obj)) {
                      return false;
                  }
                  if (ReferenceEquals(this, obj)) {
                      return true;
                  }
                  if (obj.GetType() != typeof(MyObj)) {
                      return false;
                  }
                  return Equals((MyObj)obj);
              }
          
              public override int GetHashCode()
              {
                  return this.m_id;
              }
          }
          

          第二种解决方案如下:

          class MyComparer : IEqualityComparer<MyObj>
          {
              public bool Equals(MyObj x, MyObj y)
              {
                  return x.GetId() == y.GetId();
              }
          
              public int GetHashCode(MyObj obj)
              {
                  return obj.GetId();
              }
          }
          
          var resultList = refList1.Union(refList2, new MyComparer()).ToList();
          

          并且不需要更改class MyObj

          【讨论】:

          • @Edward83:如果在您的应用程序中为MyObj 对象定义一个单一 相等定义是有意义的,并且您可以编辑源代码,那么第一种方法可能更可取(它会让你在任何地方免费重用相等逻辑)。否则,请使用第二个。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-09-08
          • 1970-01-01
          • 2014-01-26
          • 2017-09-05
          • 1970-01-01
          相关资源
          最近更新 更多