Как производить сортировку по различным полям - C#
Формулировка задачи:
Это можно делать с помощью Linq вроде бы. Но я вот уперся в интерфейс IComparable. Можно ли отсортировать по разным полям, меняя каким-то образом CompareTo()? ...И почему компилятор допускает вот такой ошибочный (неопределенный) код:
И в одном и в другом методе параметром будет объект InvoiceMaker
public int CompareTo(object invoice)
{
if (this._purchaseDayOfMonth.DayOfMonth < ((InvoiceMaker) invoice)._purchaseDayOfMonth.DayOfMonth)
return -1;
if (this._purchaseDayOfMonth.DayOfMonth > ((InvoiceMaker) invoice)._purchaseDayOfMonth.DayOfMonth)
return 1;
return 0;
}
public int CompareTo(InvoiceMaker invoice)
{
if (this._discountOption < invoice._discountOption)
return -1;
if (this._discountOption > invoice._discountOption)
return 1;
return 0;
}Решение задачи: «Как производить сортировку по различным полям»
textual
Листинг программы
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ComparationTest {
class Program {
static void Main(string[] args) {
DataObject[] dataObjects = new DataObject[] {
new DataObject{
ID=1,
FirstName="Mike",
LastName="Willis"
},
new DataObject{
ID=9,
FirstName="Kelly",
LastName="Stivenson"
},
new DataObject{
ID=2,
FirstName="Larry",
LastName="Key"
},
new DataObject{
ID=6,
FirstName="Mary",
LastName="Jay"
},
new DataObject{
ID=3,
FirstName="Dart",
LastName="Weider"
}
};
foreach (var obj in dataObjects) {
Console.WriteLine(obj);
}
Console.WriteLine();
Array.Sort(dataObjects, new IDComparer());
foreach (var obj in dataObjects) {
Console.WriteLine(obj);
}
Console.WriteLine();
Console.ReadLine();
}
}
class IDComparer : IComparer<DataObject> {
public int Compare(DataObject x, DataObject y) {
return x.ID.CompareTo(y.ID);
}
}
class FNameComparer : IComparer<DataObject> {
public int Compare(DataObject x, DataObject y) {
return x.FirstName.CompareTo(y.FirstName);
}
}
class LNameComparer : IComparer<DataObject> {
public int Compare(DataObject x, DataObject y) {
return x.LastName.CompareTo(y.LastName);
}
}
class DataObject {
public int ID { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public override string ToString() {
return string.Format("ID: {0}, FirstName: {1}, LastName: {2}",
ID, FirstName, LastName);
}
}
}