2013-11-15 22 views
0

我有一個包含18個屬性的對象(稱爲MyReading)。 我添加此對象的實例列表使用c#對用戶定義的屬性排序對象列表

如:

List<MyReading> MyReadingsL = new List<MyReading>(); 
MyReading O1 = new MyReading(); 
O1._DateTime = "10"; 
O1._Value1 = "Hello1"; 
O1._Value2 = "Hello2"; 
O1._Value3 = "Hello3"; 
O1._Value4 = "Hello4"; 

....etc 


MyReadingsL.Add(O1); 

我需要梳理讀數由18種性質的任何一個列表。 (用戶決定哪一個) 我明白我必須爲列表的Sort()方法編寫委託,以便在代碼中指定我自己的比較邏輯。

例如。 MyReadingsL.Sort(TheDelegate);

問題是,我不想寫18個代表每個屬性,我可以可能排序。 也許一個代表,一個(比較代表)接受(MyReading x,MyReading y)和一個字符串,表示要排序的屬性。

這怎麼可能?

+2

是的,這很可能,你可能不得不使用反射來從字符串中找到屬性,儘管這可能是昂貴的記憶方式。爲什麼不直接編寫比較函數或找出用戶想要排序的內容? – DGibbs

+0

是的,這是可能的。 – James

+0

如果列表被綁定到UI,爲什麼不只是UI控件提供了什麼:DataGridView等 – Ric

回答

3

很簡單。 LINQ的已經給你:

MyReadingsL.OrderBy(r => r._Value1); 
MyReadingsL.OrderBy(r => r._Value2); 
... 
MyReadingsL.OrderBy(r => r._Valuen); 
... 

如果要定義你以同樣的方式調用外部功能,您的簽名應該是這樣的:

public IEnumerable<MyReading> GetSortedList(Func<MyReading, string> property) { } 

從字符串到翻譯屬性,你可以定義一個靜態數據成員。

public static IDictionary<string, Func<MyReading, string>> Properties = 
    typeof(MyReading).GetProperties().ToDictionary(p => prop.Name, p => new Func<MyReading, string>(r => p.GetValue(r))); 

這靜態成員給你的所有屬性在類的字典,由他們確定字串,並給予您訪問,讓你執行你需要的LINQ的操作鍵的代表。

然後,給定一個字符串s標識一個屬性,您可以撥打MyReadingsL.OrderBy(Properties[s])很少的成本。

1

你可以通過linq來實現。你需要做的是傳遞你想要排序的字符串/屬性,然後使用orderby

通用例如:

// Create 10 objects with 2 properties 
var num_and_name_list = 
     from num in Enumerable.Range(1,10) 
     select new { val=num, name=(""+num+"oeu")}; 

// Here i'll sort them by the name property. 
var sorted_by_name_list = 
     from some_object in num_and_name_list 
     orderby some_object.name descending 
     select some_object; 

結果會像

enter image description here

那麼,你就得怎麼看/在你通過你的財產與排序。


如果你需要得到從字符串的屬性,你可以這樣做:

// Create 10 objects with 3 properties 
var num_and_name_list = 
     from num in Enumerable.Range(1, 10) 
     select new ExtraStringDataPoint (num, num*2, ("" + num + "oeu")); 

// Hunting your property starts 
Type myType = num_and_name_list.GetType(); 
IList<PropertyInfo> props = new List<PropertyInfo>(myType.GetProperties()); 

PropertyInfo order_on_this = null; 
foreach (PropertyInfo prop in props) 
{ 
    order_on_this = typeof(ExtraStringDataPoint).GetProperty("Y"); 
} 


// Here i'll sort them by the name property. 
var sorted_by_name_list = 
     from some_object in num_and_name_list 
     orderby order_on_this descending 
     select some_object; 

ExtraStringDataPoint樣子:

public class ExtraStringDataPoint : IDataPoint 
{ 
    public ExtraStringDataPoint(double x, double y, string s) 
    { 
     X = x; 
     Y = y; 
     Extra = s; 
    } 
    public double X { get; set; } 
    public double Y { get; set; } 
    public string Extra { get; set; } 

    public override string ToString() 
    { 
     return X +" , " + Y + " , " + Extra; 
    } 
} 

在你的情況,你可以將所需的變量作爲字符串傳遞,就像我使用「Y」一樣。

+0

我認爲問題的癥結在於如何從用戶定義的字符串轉換爲可以用列表排序的委託。 –

相關問題