_List<Card>
_があり、これらのカードを並べ替えたい
したがって、ID
、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);
}
}
_
しかし、その後、ビジュアルスタジオからエラーが送信されました。
_
'Card'
_はインターフェイスメンバーを実装していません'IComparer<Card>.Compare(Card, Card)'
あなたはおそらく、あなたのクラスを持ちたいと思います ComparableComparator ではありません=
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();
Edit:選択するseveral基準が必要な場合は、いくつかのComparerを次のように実装する必要があります。分離されたクラス、例えば.
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);
}
}
ソート時に必要なものを提供します:
List<Card> myList = ...
myList.Sort(new CardByIdComparer());
編集2:(支出者のライブラリに触発された)。複数の比較演算子を結合したい場合(つまり、comparer1
、同点-comparer2
など)
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
));
Linqを使用する最も簡単な方法:
List<Card> objSortedList = objListObject.OrderBy(o=>o.ID).ToList();
または
List<Card> objSortedList = objListObject.OrderByDescending(o=>o.ID).ToList();
良い例 の概念を示しますList<T>.Sort(IComparer <T>)
メソッドリンクを確認してください。
IComparer<T>
この例では、文字列に使用される比較メソッドIComparer<T>
ですが、ID(int)にも使用できます。
using System;
using System.Collections.Generic;
class GFG : IComparer<string>
{
public int Compare(string x, string y)
{
if (x == null || y == null)
{
return 0;
}
// "CompareTo()" method
return x.CompareTo(y);
}
}
public class geek
{
public static void Main()
{
List<string> list1 = new List<string>();
// list elements
list1.Add("C++");
list1.Add("Java");
list1.Add("C");
list1.Add("Python");
list1.Add("HTML");
list1.Add("CSS");
list1.Add("Scala");
list1.Add("Ruby");
list1.Add("Perl");
int range = 4;
GFG gg = new GFG();
Console.WriteLine("\nSort a range with comparer:");
// sort the list within a
// range of index 1 to 4
// where range = 4
list1.Sort(1, range, gg);
Console.WriteLine("\nBinarySearch and Insert Dart");
// Binary Search and storing
// index value to "index"
int index = list1.BinarySearch(0, range,
"Dart", gg);
if (index < 0)
{
list1.Insert(~index, "Dart");
range++;
}
}
}
IComparerを実装する必要があります
public int Compare(Card card1, Card card2)
{
if (card1.ID > card2.ID)
return 1; //move card1 up
if (card2.ID < card1.ID)
return -1; //move card2 up
return 0; //do nothing
}