Tag: icomparer

IEqualityComparer和singleton

我想知道是否有可能使用singleton作为comparerObject,例如Distinct ?? 假设我有一个元素列表,我需要在该列表中使用不同的函数。 通常我会这样做 var result = list.Distinct(new ListElementComparer); ListElementComparer是一个实现IEqualityComparer接口的类。 但是,让我们假设我将经常使用上面提到的代码,例如那样。 List<List> elementList = new List<List>(); List<List> resultList new List<List>(); foreach(var element in elementList ) resultList.AddRange(element.Distinct(new ListElementComparer() ) ); 因此,您可以创建很多次ListElementComparer的对象。 在这种情况下,在每次迭代中使用单一内容创建ListElementComparer是否有任何意义? 如果我使用单身人士,那么独特的方法会有效吗?

如何按值排序(自定义排序)词典条目列表

我的哈希表包含(key,Values []) 例如: myHashtable[keys, Values[]] myHashtable.Add[1, Value1]; myHashtable.Add[2, Value2]; myHashtable.Add[3, Value3]; myHashtable.Add[4, Value4]; myHashtable.Add[5, Value5]; 哪里有Value1; Value2,value3,value4和value5如下。 Value1[name = “Smith”] Value1[Title= “Mr”] Value1[Salary = 1000] Value1[Identity = “S”] Value2[name = “Peter”] Value2[Title= “Mr”] Value2[Salary = 1000] Value2[Identity = “A”] Value3[name = “Tom”] Value3[Title= “Mr”] Value3[Salary = 1000] Value3[Identity = “C”] Value4[name = “Marry”] Value4[Title= “Ms”] […]

比较对象的不同实现的优点/缺点

这个问题涉及基本相同代码的2种不同实现。 首先,使用委托创建一个比较方法,该方法可以在排序对象集合时用作参数: class Foo { public static Comparison BarComparison = delegate(Foo foo1, Foo foo2) { return foo1.Bar.CompareTo(foo2.Bar); }; } 当我想要一种以与CompareTo函数提供的方式不同的方式对Foo对象集合进行排序时,我使用上述方法。 例如: List fooList = new List(); fooList.Sort(BarComparison); 二,使用IComparer: public class BarComparer : IComparer { public int Compare(Foo foo1, Foo foo2) { return foo1.Bar.CompareTo(foo2.Bar); } } 当我想在Foo对象的集合中对Foo对象进行二进制搜索时,我使用上面的代码。 例如: BarComparer comparer = new BarComparer(); List fooList = […]

C#lambda表达式和IComparer

我使用lambda表达式在C#中排序和搜索数组。 我不想在我的类中实现IComparer接口,因为我需要对多个成员字段进行排序和搜索。 class Widget { public int foo; public void Bar() { Widget[] widgets; Array.Sort(widgets, (a, b) => a.foo.CompareTo(b.foo)); Widget x = new Widget(); x.foo = 5; int index = Array.BinarySearch(widgets, x, (a, b) => a.foo.CompareTo(b.foo)); } } 虽然排序工作正常,但二进制搜索会产生编译错误无法将lambda表达式转换为类型’System.Collections.IComparer ‘,因为它不是委托类型 。 由于某种原因,Sort对IComparer和Comparison都有重载,但BinarySearch只支持IComparer。 经过一些研究,我发现了ComparisonComparer笨重的ComparisonComparer将比较转换为IComparer: public class ComparisonComparer : IComparer { private readonly Comparison comparison; public ComparisonComparer(Comparison […]

如何使我的通用比较器(IComparer)处理空值?

我正在尝试编写用于排序的通用对象比较器,但我注意到它不处理其中一个值比较为null的实例。 当一个对象为null时,我希望它对待它与空字符串相同。 我已经尝试将空值设置为String.Empty,但是当我在其上调用CompareTo()时,我得到“对象必须是String类型”的错误。 public int Compare(T x, T y) { PropertyInfo propertyInfo = typeof(T).GetProperty(sortExpression); IComparable obj1 = (IComparable)propertyInfo.GetValue(x, null); IComparable obj2 = (IComparable)propertyInfo.GetValue(y, null); if (obj1 == null) obj1 = String.Empty; // This doesn’t work! if (obj2 == null) obj2 = String.Empty; // This doesn’t work! if (SortDirection == SortDirection.Ascending) return obj1.CompareTo(obj2); else return obj2.CompareTo(obj1); […]

修改List.Contains行为

我有一个List , class MyObj : IComparable 。 我根据IComparable接口在MyObj类中编写了CompareTo方法,但是当我使用List.Contains(myObjInstance)时,它应该为true时返回false 。 我不确定我是否理解如何在调用然后Contains函数时确保List使用我的自定义比较方法。 这是我的compareTo实现: #region IComparable Members public int CompareTo(object obj) { MyObj myObj = (MyObj)obj; return String.Compare(this.Symbol, myObj.Symbol, true); } #endregion 请注意,Symbol属性是一个字符串。 为了澄清我在compareTo方法中设置了一个停止点,它甚至没有进入那里。 有人试过吗? 谢谢。

LINQ orderby vs IComparer

我想知道什么是更好用。 用于排序的IComparer类和比较方法或列表上的LINQ orderby。 两者都工作正常但哪一个更适合大型列表。

使用IComparer进行随机播放

首先,我确实知道Fisher-Yates shuffle。 但为了论证,我想允许用户从下拉列表中选择一个排序选项。 该列表将包括“随机”选项。 根据他们的选择结果,我只想在IComparer实例中替换我的排序。 IComparer会是什么样子? Google提出了大量有缺陷的结果,这些结果都采取以下forms: public class NaiveRandomizer : IComparer { private static Random rand = new Random(); public int Compare(T x, T y) { return (x.Equals(y))?0:rand.Next(-1, 2); } } 但是,该实现是有偏见的,甚至会在某些情况下抛出exception。 可以使用以下代码演示偏差: void Test() { Console.WriteLine(“NaiveRandomizer Test:”); var data = new List() {1,2,3}; var sortCounts = new Dictionary(6); var randomly = new NaiveRandomizer(); […]

使用IComparer进行排序

我正在尝试使用IComparer来对点列表进行排序。 这是IComparer类: public class CoordinatesBasedComparer : IComparer { public int Compare(Object q, Object r) { Point a = (p)q; Point b = (p)r; if ((ax == bx) && (ay == by)) return 0; if ((ax < bx) || ((ax == bx) && (ay < by))) return -1; return 1; } } 在客户端代码中,我试图使用此类来排序点列表p( List类型): CoordinatesBasedComparer c […]

用字符串实现自定义IComparer

例如,我在c#中有一组字符串; var example = new string[]{“c”, “b”, “a”, “d”}; 然后我对它进行排序,但是我的IComparer方法不起作用,并且通过看起来无限循环。 基本上我需要”b”先来,然后是”c” ,然后我不关心任何其他人的顺序。 这可能是使用I Comparer和Compare(string x, string y)方法吗? 编辑:代码 public int Compare(string x, string y) { var sOrder = new string[] { “b”, “c” }; int index_x = -1; int index_y = -1; for (int i = 0; i = 0 && index_y >= 0) { […]