C# 如果它是重复的,LINQ只能得到一个
你好,我有这个名单 发送方-接收方 1----2 2------1 1----3 1----2 3------1 2------1 在此列表中,我只想得到: 1-2和1-3C# 如果它是重复的,LINQ只能得到一个,c#,linq,C#,Linq,你好,我有这个名单 发送方-接收方 1----2 2------1 1----3 1----2 3------1 2------1 在此列表中,我只想得到: 1-2和1-3 其他的都是重复的,右边的Id和左边的相同,两个Id发送者和接收者指向同一张表,对我来说是1-3还是3-1都无关紧要,我只想得到其中一个。有可能吗?谢谢 您只需选择发送方/接收方中较小的一个,然后调用Distinct: 如果您在类上或通过类似的方式实现了相等,则简单的 public class MyClass { pu
其他的都是重复的,右边的Id和左边的相同,两个Id发送者和接收者指向同一张表,对我来说是1-3还是3-1都无关紧要,我只想得到其中一个。有可能吗?谢谢 您只需选择发送方/接收方中较小的一个,然后调用Distinct:
如果您在类上或通过类似的方式实现了相等,则简单的
public class MyClass
{
public int Sender { get; set; }
public int Receiver { get; set; }
public override int GetHashCode()
{
return Sender ^ Receiver;
}
public override bool Equals(object other)
{
if (other == null || this.GetType() != other.GetType())
return false;
var o = (MyClass)other;
return Math.Min(this.Sender, this.Receiver) == Math.Min(o.Sender, o.Receiver) &&
Math.Max(this.Sender, this.Receiver) == Math.Max(o.Sender, o.Receiver);
}
}
// use like
var myList = new List<MyClass>
{
new MyClass { Sender = 1, Receiver = 2 },
new MyClass { Sender = 2, Receiver = 1 },
new MyClass { Sender = 1, Receiver = 3 },
new MyClass { Sender = 1, Receiver = 2 },
new MyClass { Sender = 3, Receiver = 1 },
new MyClass { Sender = 2, Receiver = 1 },
};
var distinctOnes = myList.Distinct(); // contains 1,2 and 1,3
已经有一些很好的答案了,但是我已经准备好了,所以这里是另一个LINQ解决方案
var recieverHighArr = from e in list
where e.Sender < e.Reciever
select new { high = e.Reciever, low = e.Sender };
var senderHighArr= from e in list
where e.Sender >= e.Reciever
select new { high = e.Sender, low = e.Reciever };
var concat = senderHighArr.Concat(recieverHighArr).Distinct();
foreach (var ob in concat)
{
Console.WriteLine(ob.high + " " + ob.low);
}
发送方/接收方对是一个对象吗?如果是这样,请创建一个IEqualityComparer类型,并将其实例传递给Distinct和您的golden。这正是我的想法
var recieverHighArr = from e in list
where e.Sender < e.Reciever
select new { high = e.Reciever, low = e.Sender };
var senderHighArr= from e in list
where e.Sender >= e.Reciever
select new { high = e.Sender, low = e.Reciever };
var concat = senderHighArr.Concat(recieverHighArr).Distinct();
foreach (var ob in concat)
{
Console.WriteLine(ob.high + " " + ob.low);
}