Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在不重复的情况下合并两个列表?(可能的dup)_C#_Linq - Fatal编程技术网

C# 如何在不重复的情况下合并两个列表?(可能的dup)

C# 如何在不重复的情况下合并两个列表?(可能的dup),c#,linq,C#,Linq,我想我的搜索选项范围会很容易找到这个 我希望合并两份清单,不要重复。这是我的黑客尝试 public class MyClass { public Guid? MyGuid { get; set; } } //..... Guid? dupGuid1 = Guid.NewGuid(); Guid? uniqueGuid1 = Guid.NewGuid(); MyClass x1 = new MyClass { MyGuid = dupGuid1 }; List<MyClass&

我想我的搜索选项范围会很容易找到这个

我希望合并两份清单,不要重复。这是我的黑客尝试

public class MyClass
{
    public Guid? MyGuid { get; set; }
}

//.....

Guid? dupGuid1 = Guid.NewGuid();
Guid? uniqueGuid1 = Guid.NewGuid();

MyClass x1 = new MyClass { MyGuid = dupGuid1 };
List<MyClass> myMainList = new List<MyClass>() { x1 };


MyClass y1 = new MyClass { MyGuid = dupGuid1 };
MyClass y2 = new MyClass { MyGuid = uniqueGuid1 };
List<MyClass> myAddList = new List<MyClass> { y1, y2 };

myMainList.AddRange(myAddList
   .Where(w => w.MyGuid != myAddList.SelectMany(s => s.MyGuid).ToList()));

Debug.Assert(myMainList.Count == 2);
公共类MyClass
{
公共Guid?MyGuid{get;set;}
}
//.....
Guid?dupGuid1=Guid.NewGuid();
Guid?uniqueGuid1=Guid.NewGuid();
MyClass x1=新MyClass{MyGuid=dupGuid1};
List myMainList=新列表(){x1};
MyClass y1=新MyClass{MyGuid=dupGuid1};
MyClass y2=新MyClass{MyGuid=uniqueGuid1};
List myAddList=新列表{y1,y2};
myMainList.AddRange(myAddList
.Where(w=>w.MyGuid!=myAddList.SelectMany(s=>s.MyGuid.ToList());
Assert(myMainList.Count==2);
我该怎么做?谢谢

var uniqueList = myMainList
   .Concat(myAddList)
   .GroupBy(item => item.MyGuid)
   .Select(group => group.First())
   .ToArray();

var uniqueList=myMainList
.Concat(myAddList)
.DistinctBy(项=>item.MyGuid)
.ToArray();
公共静态IEnumerable DistinctBy(此IEnumerable items,
功能键控器)
{
var set=新的HashSet();
var list=新列表();
foreach(项目中的var项目)
{
var键=键控器(项目);
if(设置包含(键))
持续
列表。添加(项目);
set.Add(键);
}
退货清单;
}

var uniqueList=myMainList
.Concat(myAddList)
.DistinctBy(项=>item.MyGuid)
.ToArray();
公共静态IEnumerable DistinctBy(此IEnumerable items,
功能键控器)
{
var set=新的HashSet();
var list=新列表();
foreach(项目中的var项目)
{
var键=键控器(项目);
if(设置包含(键))
持续
列表。添加(项目);
set.Add(键);
}
退货清单;
}
使用
Union()
应该可以做到这一点

摘自:

编辑

您还需要重写类上的
GetHashCode()
Equals(objectobj)
(无论如何都应该这样做)

公共类MyClass
{
公共int ID{get;set;}
公共覆盖布尔等于(对象对象对象)
{
返回this.ID==((MyClass)obj.ID;
}
公共覆盖int GetHashCode()
{
返回ID.GetHashCode();
}
}
var lst1=new List{new MyClass{ID=1},new MyClass{ID=2},new MyClass{ID=3};
var lst2=新列表{new MyClass{ID=3},新MyClass{ID=4},新MyClass{ID=5};
var newList=lst1.Union(lst2);
foreach(newList中的var myClass)
{
WriteLine(“ID:{0}”,myClass.ID);
}
使用
Union()
应该可以做到这一点

摘自:

编辑

您还需要重写类上的
GetHashCode()
Equals(objectobj)
(无论如何都应该这样做)

公共类MyClass
{
公共int ID{get;set;}
公共覆盖布尔等于(对象对象对象)
{
返回this.ID==((MyClass)obj.ID;
}
公共覆盖int GetHashCode()
{
返回ID.GetHashCode();
}
}
var lst1=new List{new MyClass{ID=1},new MyClass{ID=2},new MyClass{ID=3};
var lst2=新列表{new MyClass{ID=3},新MyClass{ID=4},新MyClass{ID=5};
var newList=lst1.Union(lst2);
foreach(newList中的var myClass)
{
WriteLine(“ID:{0}”,myClass.ID);
}

为什么要比较Guid?对于一个列表,它甚至不应该编译。不值得回答,而是考虑创建一个通用的<代码> CustomComparer <代码>类,它实现<代码> IEqualityComparer < /Cord>,并采取一些谓词,然后在比较其他自定义类型时可以使用该类。为什么要比较GUID?对于一个列表,它甚至不应该编译。不值得回答,而是考虑创建一个通用的<代码> CustomComparer <代码>类,它实现<代码> IEqualityComparer < /Cord>,并采取一些谓词,然后在比较其他自定义类型时可以使用该类。- 1…我猜您没有注意到他使用的是自定义类
MyClass
,这意味着他必须为大多数LINQ方法实现
IEqualityComparer
。-1。。我猜您没有注意到他使用的是自定义类
MyClass
,这意味着他必须为大多数LINQ方法实现
IEqualityComparer
  var uniqueList = myMainList
      .Concat(myAddList)
      .DistinctBy(item => item.MyGuid)
      .ToArray();

  public static IEnumerable<T> DistinctBy<T, TKey>(this IEnumerable<T> items, 
                    Func<T, TKey> keyer)
  {
    var set = new HashSet<TKey>();
    var list = new List<T>();
    foreach (var item in items)
    {
      var key = keyer(item);
      if (set.Contains(key))
        continue;
      list.Add(item);
      set.Add(key);
    }
    return list;
  }
var list1 = new[] { "a", "s", "d" };
var list2 = new[] { "d", "a", "f", "123" };
var union = list1.Union(list2);
union.Dump(); // this is a LinqPad method
public class MyClass
    {
        public int ID { get; set; }

        public override bool Equals(object obj)
        {
            return this.ID == ((MyClass)obj).ID;
        }

        public override int GetHashCode()
        {
            return ID.GetHashCode();
        }
    }

var lst1 = new List<MyClass> { new MyClass { ID = 1 }, new MyClass { ID = 2 }, new MyClass { ID = 3 } };
var lst2 = new List<MyClass> { new MyClass { ID = 3 }, new MyClass { ID = 4 }, new MyClass { ID = 5 } };

var newList = lst1.Union(lst2);

foreach (var myClass in newList)
    {
        Console.WriteLine("ID: {0}", myClass.ID);
        }