我需要按串列的任何一個屬性對串列進行排序,但我不知道它將專門對這些屬性中的哪一個進行排序。下面的主要方法。
static void Main(string[] args)
{
Things<Something> something = new Things<Something>();
something.Add(new Something
{ Thing = "Apartment", Price = 1500000 });
something.Add(new Something
{ Thing = "Bed", Price = 10000 });
something.Add(new Something
{ Thing = "Lamp", Price = 600 });
something.Add(new Something
{ Thing = "Car", Price = 5000000 });
Console.WriteLine("\n\tStuff sorted by description");
something = something.SelectionSort("Thing");
foreach (Something thing in something)
Console.WriteLine("\t" thing);
Console.WriteLine("\n\tStock items sorted by value");
something = something.SelectionSort("Value");
foreach (Something thing in something)
Console.WriteLine("\t" thing);
Console.Write("\n\tPress any key to exit ...");
Console.ReadKey();
}
我有一個結構
public struct Something
{
public string Thing { get; set; }
public decimal Price { get; set; }
}
還有一個叫做 things 的通用容器類
public class Things<T> : IEnumerable<T>
{
private List<T> lstItems;
public int Count { get { return lstItems.Count; } }
public Things() { lstItems = new List<T>(); }
public Things(List<T> items_) { lstItems = new List<T>(items_); }
public void Add(T item)
{
lstItems.Add(item);
}
public T this[int i]
{
get { return lstItems[i]; }
set { lstItems[i] = value; }
}
IEnumerator IEnumerable.GetEnumerator()
{
throw new System.NotImplementedException();
}
public IEnumerator<T> GetEnumerator()
{
foreach (T item in lstItems)
yield return item;
}
}
擴展類擴展了通用容器類
public static class ExtensionsClass
{
private static string SortFiield { get; set; }
private static object GetProperty<T>(T thing, string nameofProp)
{
return thing.GetType().GetProperty(nameofProp).GetValue(thing, null);
}
private static int Compare<T>(T x, T y)
{
IComparable propX = (IComparable)GetProperty(x, SortFiield);
IComparable propY = (IComparable)GetProperty(y, SortFiield);
return propX.CompareTo(propY);
}
public static Things<T> SelectionSort<T>(this Things<T> things, string SORTFIELD)
{
List<T> lsstt = new List<T>(things);
int iIndex;
T temporary;
SortFiield = SORTFIELD;
for (int i = 0; i < lsstt.Count - 1; i )
{
iIndex = i;
for (int j = i 1; j < lsstt.Count; j )
{
string first = GetProperty(lsstt[j], SortFiield).ToString();
string second = GetProperty(lsstt[iIndex], SortFiield).ToString();
if (Compare(first, second) < 0)
iIndex = j;
}
temporary = lsstt[i];
lsstt[i] = lsstt[iIndex];
lsstt[iIndex] = temporary;
}
return new Things<T>(lsstt);
}
}
我遇到的問題是擴展類中的 get 屬性回傳 null,但我知道我試圖回傳的物件存在。它由“String first = ....”行找到,但是當從 Compare 方法呼叫 getproperty 時,它回傳 null。
uj5u.com熱心網友回復:
您將“第一”、“第二”傳遞給比較。在您的情況下,它們都是字串而不是物件,您需要將“ lsstt[j] ”和“ lsstt[iIndex] ”傳遞給它。
if (Compare(lsstt[j], lsstt[iIndex]) < 0)
iIndex = j;
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/449176.html
上一篇:不依賴泛型型別的特征或方法
下一篇:如何在C#中使方法泛型?