C# 如果它是重复的,LINQ只能得到一个

C# 如果它是重复的,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

你好,我有这个名单

发送方-接收方

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
{
    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);
        }