0

这是我的对象:

public class MyObject
{
    public int id { get; set; }
    public string fileName { get; set; }
    public string browser { get; set; }    
    public string protocol { get; set; }    
    public string family { get; set; }
}

我有一个我的对象列表:

List<Capture> list = db.Captures.Where(x => x.family == "Web").ToList();

我想要做的是获取删除重复项的新列表protocol。例如,如果我的列表中有 10 个对象,其中 9 个带有协议DOC和 1,PDF我想要一个只有 2 个对象DOC和 1个的新列表PDF

4

4 回答 4

1

有几种方法可以做到这一点,具体取决于您通常希望如何使用您的MyObject类的实例。

最简单的一种是实现IEquatable<T>接口以便仅比较protocol字段:

public class MyObject : IEquatable<MyObject>
{
    public sealed override bool Equals(object other)
    {
        return Equals(other as MyObject);
    }

    public bool Equals(MyObject other)
    {
        if (other == null) {
            return false;
        } else {
            return this.protocol == other.protocol;
        }
    }

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

然后,您可以Distinct在将您的可枚举转换为列表之前调用。


或者,您可以使用Distinct采用IEqualityComparer.

相等比较器必须是根据您的标准确定相等的对象,在问题中描述的情况下,通过查看protocol字段:

public class MyObjectEqualityComparer : IEqualityComparer<MyObject>
{
    public bool Equals(MyObject x, MyObject y)
    {
        if (x == null) {
            return y == null;
        } else {
            if (y == null) {
                return false;
            } else {
                return x.protocol == y.protocol;
            }
        }
    }

    public int GetHashCode(MyObject obj)
    {
        if (obj == null) {
            throw new ArgumentNullException("obj");
        }

        return obj.protocol.GetHashCode();
    }
}
于 2013-11-10T15:38:14.933 回答
1

我相信这是最简单的方法:以下将分组listprotocol然后从每个组中获取第一个实例,以生成具有每种类型的一个实例的可枚举protocol

list.GroupBy(x => protocol, x => x)
    .SelectMany(k, v => v.First());
于 2013-11-10T15:59:04.497 回答
0

您可以使用Distinct,也可以使用此处提供的相同解决方案:

与 lambda 不同()?

于 2013-11-10T15:38:40.163 回答
0

选择不同的协议,循环它们并仅选择同一协议的第一个对象-因此您将获得所需的列表。

于 2013-11-10T15:38:04.990 回答