我有一個很多的實體,我想寫一些通用的排序類,它可以提供給我一個給定的對象和屬性的排序列表。例如通用排序
Class Country
{
public int id { get; set; }
public string CountryName { get; set; }
}
現在我應該能夠將未排序的列表傳遞給我的排序器類以及應該排序的屬性名稱。現在我已經打了很久,現在被卡住了。任何幫助將不勝感激。
我有一個很多的實體,我想寫一些通用的排序類,它可以提供給我一個給定的對象和屬性的排序列表。例如通用排序
Class Country
{
public int id { get; set; }
public string CountryName { get; set; }
}
現在我應該能夠將未排序的列表傳遞給我的排序器類以及應該排序的屬性名稱。現在我已經打了很久,現在被卡住了。任何幫助將不勝感激。
如果您使用的是Java,請查看Collections.Sort(...)。有兩個版本,一個我認爲使用你的元素的自然排序來排序它們(看看Compareable)接口,另一個接受Comparator。要麼應該工作。否則,我相信其他語言有非常相似的東西。
解決方法:
您沒有提及語言。在c#
中,您可以讓您的類實現接口IComparable
並添加CompareTo
函數,該函數需要兩個參數並返回哪個更大,或者使用匿名函數執行相同操作。
不好意思提,我使用,我不想使用IComparable的事情太多。 –
使用.NET LINQ
擴展方法,或者更具體地說,動態LINQ部分,可以很容易地通過屬性名稱進行排序。看看Scott Gu寫的Dynamic LINQ (Part 1: Using the LINQ Dynamic Query Library)關於它是如何工作的。實質上,您的分類器類別不需要超過LINQ擴展OrderBy
和OrderByDescending
的花式封裝。
下面是一個例子:
var sortedCountries = listOfCountries.OrderBy("CountryName");
另外,如果你熟悉仿製藥,你可以寫一個接受集合的包裝,以及用於選擇的屬性值Func<TSource, TKey>
,像這樣:
public class MySorterClass
{
public IEnumerable<TSource> OrderList<TSource, TKey>(IEnumerable<TSource> list, Func<TSource, TKey> selector)
{
return list.OrderBy(selector);
}
public IEnumerable<TSource> OrderList<TSource>(IEnumerable<TSource> list, string propertyName)
{
return list.OrderBy(propertyName);
}
}
感謝理查德,對泛型的解決方案對我更有意義,因爲我沒有在我的項目中使用LINQ。 –
在你建議的解決方案中,你使用'OrderBy'和'OrderByDescending',它們都是LINQ方法。我強烈建議看看動態的LINQ的東西。 :) – Richard
最後我能夠實現泛型分類器,並且將它作爲擴展方法來使用,因此我可以在任何使用List的地方使用它,下面是我的實現。 sortorder是Asc/Desc,propertyname是類型爲T的屬性的名稱。這工作正常,我對此感到滿意。
public static List<T> SortedListWithLamda<T>(this List<T> list, string sortorder, string propertyname)
{
List<T> sortedlist = new List<T>();
if (!string.IsNullOrEmpty(propertyname) && list != null && list.Count > 0)
{
Type t = list[0].GetType();
if (sortorder == "A")
{
sortedlist = list.OrderBy(
a => t.InvokeMember(
propertyname
, BindingFlags.GetProperty
, null
, a
, null
)
).ToList();
}
else
{
sortedlist = list.OrderByDescending(
a => t.InvokeMember(
propertyname
, BindingFlags.GetProperty
, null
, a
, null
)
).ToList();
}
}
return sortedlist;
}
如果這是您想要的解決方案,您可能需要考慮將'sortorder'更改爲'enum',並且還需要對'T'類型進行屬性檢查。 :) – Richard
道歉失蹤的信息,我使用C# –