标签: iequalitycomparer

具有由lambda定义的自定义IEqualityCompare的HashSet构造函数?

目前HashSet<T>,允许您自己定义相等比较的HashSet<T>(IEqualityComparer<T> comparer)构造函数是构造函数.我想将此EqualityComparer定义为lambda.

我发现这个博客帖子已经创建了一个类,允许你通过lambda生成你的比较器,然后使用extention方法隐藏这个类的构造,例如一个Except().

现在我想用构造函数做同样的事情.是否可以通过扩展方法创建构造函数?还是有另一种方式我可以以某种方式创建一个HashSet<T>(Func<T,T,int> comparer)

--UPDATE--
为了清楚起见,这是我所要完成的徒手版本的一个片段:

HashSet<FileInfo> resultFiles = new HashSet<FileInfo>(
    srcPath.GetFiles(),
    new LambdaComparer<FileInfo>(
        (f1, f2) => f1.Name.SubString(10).Equals(f2.Name.SubString(10))));
Run Code Online (Sandbox Code Playgroud)

或更理想的

HashSet<FileInfo> resultFiles = new HashSet<FileInfo>(
    srcPath.GetFiles(),
    (f1, f2) => f1.Name.SubString(10).Equals(f2.Name.SubString(10)));
Run Code Online (Sandbox Code Playgroud)

.net c# lambda iequalitycomparer

5
推荐指数
1
解决办法
6891
查看次数

自定义Generic.IEqualityComparer(Of T)-编译器错误

我正在尝试实现一个简单的IEqulityComparer以与LINQ集合一起使用。我编写了以下代码,出于讨论目的,这些代码简化为最简单的形式...

Public Structure bob
    Dim SiteID As Integer
    Dim fred As String
End Structure

Public Class insCompare
    Implements System.Collections.Generic.IEqualityComparer(Of bob)

    Public Function Equals(ByVal x As bob, ByVal y As bob) As Boolean
        Return IIf(x.SiteID = y.SiteID, True, False)

    End Function

    Public Function GetHashCode(ByVal x As bob) As Integer
        Return x.SiteID.GetHashCode()

    End Function

End Class
Run Code Online (Sandbox Code Playgroud)

我的问题是两个函数都抛出编译器警告“函数'getHashCode'(或'Equals')在基类'Object'中遮盖了可覆盖的方法。要覆盖基类方法,必须将该方法声明为'Overrides '。”

但是,如果我将它们声明为Overrides,则会出现错误“函数'GetHashCode'无法声明为Overrides,因为它没有覆盖基类中的函数。”!

我还在“ Implements”行上收到编译器错误,以至于我必须实现“ getHashCode”,但我认为这是第一个问题的结果。

我所有的研究都表明我应该没事-有人知道了吗?

linq vb.net compiler-warnings iequalitycomparer

5
推荐指数
2
解决办法
4956
查看次数

C# - List <T> .Remove()始终删除列表中的第一个对象

在Visual Studio 2008中工作(C#)...我使用List集合来存储我的自定义类(Shift)的实例.

我想使用Remove方法从列表中删除某个班次.

但List.Remove()总是删除它找到的第一个项目.

我为我的Shift实现了IComparable接口,我认为这就够了,然后我添加了IEqualityComparer的实现,它仍然没有效果.

以下是我的实施摘录:

地区IComparable会员

    public int CompareTo(object obj)
    {
        Shift s1 = this;
        Shift s2 = (Shift)obj;
        if (s1.start.time != s2.start.time)
            return s1.start.CompareTo(s2.start);
        else
            return s1.end.CompareTo(s2.end);
    }
Run Code Online (Sandbox Code Playgroud)

endregion

region IEqualityComparer成员

    public bool Equals(Shift x, Shift y)
    {

        if ((x.opening) != (y.opening)) return false;
        if ((x.closing) != (y.closing)) return false;
        if (!x.opening) if (x._start != y._start) return false;
        if (!x.closing) if (x._end != y._end) return false;
        if (x.when != y.when) return false;
        if (x.day != y.day) return …
Run Code Online (Sandbox Code Playgroud)

.net c# equality generic-list iequalitycomparer

5
推荐指数
1
解决办法
5916
查看次数

使用带有LINQ to Entities Except子句的IEqualityComparer

我有一个实体,我想与一个子集进行比较,并确定选择除子集之外的所有实体.

所以,我的查询看起来像这样:

Products.Except(ProductsToRemove(), new ProductComparer())
Run Code Online (Sandbox Code Playgroud)

ProductsToRemove()方法List<Product>在执行一些任务后返回a .因此,它是最简单的形式,就是上面的.

这个ProductComparer()类看起来像这样:

public class ProductComparer : IEqualityComparer<Product>
{
    public bool Equals(Product a, Product b)
    {
        if (ReferenceEquals(a, b)) return true;

        if (ReferenceEquals(a, null) || ReferenceEquals(b, null))
            return false;

        return a.Id == b.Id;
    }

    public int GetHashCode(Product product)
    {
        if (ReferenceEquals(product, null)) return 0;
        var hashProductId = product.Id.GetHashCode();
        return hashProductId;
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,我不断收到以下异常:

LINQ to Entities无法识别方法'System.Linq.IQueryable 1[UnitedOne.Data.Sql.Product] Except[Product](System.Linq.IQueryable1 [UnitedOne.Data.Sql.Product],System.Collections.Generic.IEnumerable 1[UnitedOne.Data.Sql.Product], System.Collections.Generic.IEqualityComparer1 [UnitedOne.Data.Sql.Product])'方法,而且这个方法不能被翻译成商店表达.

linq linq-to-entities iequalitycomparer

5
推荐指数
1
解决办法
1万
查看次数

使用Except的自定义对象未能使用IEqualityComparer <T>

这是目标代码:

public class DlpItem : IEqualityComparer<DlpItem>
{   
    public string Text { get; set; }
    public int Id { get; set; }

    public DlpItem(int pId)
    {
        Text = string.Empty;
        Id = pId;
    }

    public override bool Equals(object obj)
    {
        return Id == (obj as DlpItem).Id;
    }

    public bool Equals(DlpItem a, DlpItem b)
    {
        return a.Id == b.Id;
    }

    public int GetHashCode(DlpItem item)
    {
        return Id.GetHashCode();
    }
}
Run Code Online (Sandbox Code Playgroud)

我有两个列表如下:

var list1 = new List<DlpItem>();
list1.Add(new DlpItem(1));
list1.Add(new DlpItem(2));


var list2 = new …
Run Code Online (Sandbox Code Playgroud)

c# linq iequatable iequalitycomparer

5
推荐指数
1
解决办法
1474
查看次数

EqualityComparer <T>.默认误解?

我有一个类Person,它实现了从equals()方法IEquatable<Person>(也覆盖Object.Equals方法,让我们忽略的GetHashCode()方法现在)

class Person : IEquatable<Person>
{
    public string Name { get; set; }

    public bool Equals(Person other)
    {
        return this.Name == other.Name;
    }
    public override bool Equals(object obj)
    {
        var person = obj as Person;
        return person != null && person.Name == Name;
    }
}
Run Code Online (Sandbox Code Playgroud)

好的,让我们开始:

Person p1 = new Person() { Name = "a" };
Person p2 = new Person() { Name = "a" };

List<Person> lst1 = new List<Person>() { p1 }; …
Run Code Online (Sandbox Code Playgroud)

c# .net-4.0 iequalitycomparer

5
推荐指数
1
解决办法
2262
查看次数

GetHashCode()用于长原语

我正在为LINQ distinct表达式编写EqualityComparer,我对GetHashCode重载方法不太确定.以下代码是否正确?Id属性是一个很长的原语.

public int GetHashCode(Deal obj)
{
   return ((int)obj.Id) ^ ((int)(obj.Id >> 32)); ;
}
Run Code Online (Sandbox Code Playgroud)

.net c# iequalitycomparer

5
推荐指数
1
解决办法
5545
查看次数

如何使用具有不同类的多个属性的linq`Exce`?

我试图学习Linq/Lambda表达式并被困在某个地方.

我在做什么

我创建了两个具有属性的类,其中包含一些常见属性.这些类就像(它的测试代码).

class TestA
    {
        public int Id { get; set; }
        public int ProductID { get; set; }
        public string Category { get; set; }

        public TestA(int id, int procid, string category)
        {
            this.Id = id;
            this.ProductID = procid;
            this.Category = category;
        }
    }

    class TestB
    {
        public int ProductID { get; set; }
        public string Category { get; set; }

        public TestB(int procid, string category)
        {
            this.ProductID = procid;
            this.Category = category;
        }
    }
Run Code Online (Sandbox Code Playgroud)

然后我为他们创建了两个列表, …

c# linq iequalitycomparer except

5
推荐指数
1
解决办法
9679
查看次数

IEqualityComparer使用字符串列表作为比较器

我正在尝试设置一个使用字符串列表作为比较属性的IEqualityComparer.

在下面的两行代码中使用Except和Intersect时,所有记录都被视为"new",并且没有一个被识别为"old".

List<ExclusionRecordLite> newRecords = currentRecords.Except(historicalRecords, new ExclusionRecordLiteComparer()).ToList();
List<ExclusionRecordLite> oldRecords = currentRecords.Intersect(historicalRecords, new ExclusionRecordLiteComparer()).ToList();
Run Code Online (Sandbox Code Playgroud)

这是我的IEqualityComparer类(单词是一个列表)

public class RecordComparer : IEqualityComparer<Record>
{
    public bool Equals(Record x, Record y)
    {
        if (object.ReferenceEquals(x, y))
            return true;

        if (x == null || y == null)
            return false;

        return x.Words.SequenceEqual(y.Words);
    }

    public int GetHashCode(Record obj)
    {
        return new { obj.Words }.GetHashCode();
    }
}
Run Code Online (Sandbox Code Playgroud)

c# iequalitycomparer

4
推荐指数
1
解决办法
3069
查看次数

HashSet&lt;T&gt;.CreateSetComparer() 无法指定 IEqualityComparer&lt;T&gt;,是否有替代方案?

内部源代码中有这样一个构造函数 public HashSetEqualityComparer(IEqualityComparer<T> comparer) ,但它是内部的,所以我不能使用它。

默认情况下,HashSet<T>.CreateSetComparer()仅使用将适用的无参数构造函数EqualityComparer<T>.Default

有没有办法获得一个HashSetEqualityComparer<T>选择IEqualityComparer<T>,而不需要从源代码中复制代码?

c# hashset iequalitycomparer

4
推荐指数
1
解决办法
704
查看次数