如何对List< T>进行排序在C#中

编程入门 行业动态 更新时间:2024-10-28 14:21:34
本文介绍了如何对List< T>进行排序在C#中的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧! 问题描述

我有一个List<Card>,我想对这些卡片进行排序

I've got a List<Card>, and I want to sort these cards

因此,我正在寻找一种方法,可以根据不同的条件对它们进行排序,例如其ID,其Name ...

So, I'm looking for a method to sort them with different criterias, like their ID, their Name ...

public class Card : IComparer { public string ID; public string Name; public int CompareId(object firstCard, object secondCard) { Card c1 = (Card)firstCard; Card c2 = (Card)secondCard; return c1.Id.CompareTo(c2.Id); } }

但是随后,Visual Studio向我发送了一个错误消息:

But then, visual studio sent me an error :

'Card'未实现接口成员'IComparer<Card>.Compare(Card, Card)'

'Card' does not implement interface member 'IComparer<Card>.Compare(Card, Card)'

推荐答案

您可能希望拥有自己的课程 可比较 而不是 比较器

You, probably, want to have your class Comparable not a Comparator

public class Card : IComparable<Card> { public string ID; public string Name; public int CompareTo(Card other) { if (null == other) return 1; // string.Compare is safe when Id is null return string.Compare(this.Id, other.Id); } }

然后

List<Card> myList = ... myList.Sort();

编辑:如果要选择多个条件,则必须将多个比较器实现为单独的类,例如

If you want to have several criteria to choose from, you have to implement several Comparers as separated classes, e.g.

public sealed class CardByIdComparer : IComparer<Card> { public int Compare(Card x, Card y) { if (object.ReferenceEquals(x, y)) return 0; else if (null == x) return -1; else if (null == y) return 1; else return string.Compare(x.Id, y.Id); } }

,并在排序时提供所需的内容:

and when sorting provide the required:

List<Card> myList = ... myList.Sort(new CardByIdComparer());

(受支出者图书馆的启发).如果要组合多个比较器成一个(即,使用comparer1,平局-comparer2等)

Edit 2: (inspired by spender's library). If you want to combine several comparers into one (i.e. use comparer1, on tie - comparer2 etc.)

public sealed class ComparerCombined<T> : IComparer<T> { private IComparer<T>[] m_Comparers; public ComparerCombined(params IComparer<T>[] comparers) { if (null == comparers) throw new ArgumentNullException(nameof(comparers)); m_Comparers = comparers .Select(item => item == null ? Comparer<T>.Default : item) .Where(item => item != null) .Distinct() .ToArray(); } public int Compare(T x, T y) { if (object.ReferenceEquals(x, y)) return 0; else if (null == x) return -1; else if (null == y) return 1; foreach (var comparer in m_Comparers) { int result = comparer.Compare(x, y); if (result != 0) return result; } return 0; } }

用法:

myList.Sort(new ComparerCombined( new CardByIdComparer(), // Sort By Id new CardByNameComparer() // On tie (equal Id's) sort by name ));

更多推荐

如何对List&lt; T&gt;进行排序在C#中

本文发布于:2023-11-07 04:39:16,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1565578.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:amp   List   gt   lt

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!