目前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) 我正在尝试实现一个简单的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”,但我认为这是第一个问题的结果。
我所有的研究都表明我应该没事-有人知道了吗?
在Visual Studio 2008中工作(C#)...我使用List集合来存储我的自定义类(Shift)的实例.
我想使用Remove方法从列表中删除某个班次.
但List.Remove()总是删除它找到的第一个项目.
我为我的Shift实现了IComparable接口,我认为这就够了,然后我添加了IEqualityComparer的实现,它仍然没有效果.
以下是我的实施摘录:
地区IComparable会员
Run Code Online (Sandbox Code Playgroud)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); }endregion
region IEqualityComparer成员
Run Code Online (Sandbox Code Playgroud)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 …
我有一个实体,我想与一个子集进行比较,并确定选择除子集之外的所有实体.
所以,我的查询看起来像这样:
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.IEnumerable1[UnitedOne.Data.Sql.Product], System.Collections.Generic.IEqualityComparer1 [UnitedOne.Data.Sql.Product])'方法,而且这个方法不能被翻译成商店表达.
这是目标代码:
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) 我有一个类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) 我正在为LINQ distinct表达式编写EqualityComparer,我对GetHashCode重载方法不太确定.以下代码是否正确?Id属性是一个很长的原语.
public int GetHashCode(Deal obj)
{
return ((int)obj.Id) ^ ((int)(obj.Id >> 32)); ;
}
Run Code Online (Sandbox Code Playgroud) 我试图学习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)
然后我为他们创建了两个列表, …
我正在尝试设置一个使用字符串列表作为比较属性的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) 在内部源代码中有这样一个构造函数 public HashSetEqualityComparer(IEqualityComparer<T> comparer) ,但它是内部的,所以我不能使用它。
默认情况下,HashSet<T>.CreateSetComparer()仅使用将适用的无参数构造函数EqualityComparer<T>.Default。
有没有办法获得一个HashSetEqualityComparer<T>选择IEqualityComparer<T>,而不需要从源代码中复制代码?