date
プロパティでリストをソートしたいと思います。
これは私のカスタムクラスです。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
namespace Test.Web
{
public class cTag
{
public int id { get; set; }
public int regnumber { get; set; }
public string date { get; set; }
}
}
これはソートしたいList
です:
List<cTag> Week = new List<cTag>();
私がやりたいのは、cTagクラスのdate
プロパティでリストをソートすることです。日付はdd.MM.yyyyの形式です。
IComparable
インターフェースについて読みましたが、使用方法がわかりません。
これを行う1つの方法は、delegate
List<cTag> week = new List<cTag>();
// add some stuff to the list
// now sort
week.Sort(delegate(cTag c1, cTag c2) { return c1.date.CompareTo(c2.date); });
CTagクラスがIComparable<T>
インターフェイスを実装する必要があることは正しいです。次に、リストでSort()
を呼び出すだけです。
IComparable<T>
インターフェイスを実装するには、CompareTo(T other)
メソッドを実装する必要があります。これを行う最も簡単な方法は、比較するフィールドのCompareToメソッドを呼び出すことです。これは、場合によっては日付です。
public class cTag:IComparable<cTag> {
public int id { get; set; }
public int regnumber { get; set; }
public string date { get; set; }
public int CompareTo(cTag other) {
return date.CompareTo(other.date);
}
}
ただし、これは、文字列で古典的な並べ替えを使用するため、うまく並べ替えられません(日付を文字列として宣言したため)。したがって、クラスを再定義し、日付を文字列としてではなくDateTimeとして宣言することが最善の方法だと思います。コードはほぼ同じままです:
public class cTag:IComparable<cTag> {
public int id { get; set; }
public int regnumber { get; set; }
public DateTime date { get; set; }
public int CompareTo(cTag other) {
return date.CompareTo(other.date);
}
}
日付を含む文字列をDateTime型に変換するためにクラスのインスタンスを作成するときにしなければならないことだけですが、それは簡単に行うことができます。 DateTime.Parse(String)
メソッドによる。
この場合、LINQを使用して並べ替えることもできます。
week = week.OrderBy(w => DateTime.Parse(w.date)).ToList();
List<cTag> week = new List<cTag>();
week.Sort((x, y) =>
DateTime.ParseExact(x.date, "dd.MM.yyyy", CultureInfo.InvariantCulture).CompareTo(
DateTime.ParseExact(y.date, "dd.MM.yyyy", CultureInfo.InvariantCulture))
);
まず最初に、日付プロパティが日付を保存している場合、DateTimeを使用して保存します。ソートを介して日付を解析する場合、比較される各アイテムについて日付を解析する必要がありますが、それはあまり効率的ではありません...
その後、IComparerを作成できます。
public class TagComparer : IComparer<cTag>
{
public int Compare(cTag first, cTag second)
{
if (first != null && second != null)
{
// We can compare both properties.
return first.date.CompareTo(second.date);
}
if (first == null && second == null)
{
// We can't compare any properties, so they are essentially equal.
return 0;
}
if (first != null)
{
// Only the first instance is not null, so prefer that.
return -1;
}
// Only the second instance is not null, so prefer that.
return 1;
}
}
var list = new List<cTag>();
// populate list.
list.Sort(new TagComparer());
デリゲートとしてもできます:
list.Sort((first, second) =>
{
if (first != null && second != null)
return first.date.CompareTo(second.date);
if (first == null && second == null)
return 0;
if (first != null)
return -1;
return 1;
});
Linqを使用できます。
var q = from tag in Week orderby Convert.ToDateTime(tag.date) select tag;
List<cTag> Sorted = q.ToList()
listクラスのオーバーロードされたSortメソッドを見てください。それにはいくつかの方法があります。それらの1つ:カスタムクラスはIComparableインターフェイスを実装する必要があり、その後、ListクラスのSortメソッドを使用できます。
すべての高速回答をありがとう。
これは私の解決策です:
Week.Sort(delegate(cTag c1, cTag c2) { return DateTime.Parse(c1.date).CompareTo(DateTime.Parse(c2.date)); });
ありがとう
YourVariable.Sort((a、b)=> a.amount.CompareTo(b.amount));