2013-11-15 5 views
0
으로 객체 목록 정렬

18 가지 속성이있는 객체 (MyReading)가 있습니다. 나는 18 개 특성 중 하나에 의해 측정 값의 목록을 정렬 할 필요가사용자 정의 속성에서 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); 

: 나는 목록에

예를이 객체의 인스턴스를 추가합니다. (사용자가 어떤 것을 결정하는지) 코드의 내 자신의 비교 논리를 지정하려면 목록의 Sort() 메서드에 대한 대리자를 작성해야한다는 것을 알고 있습니다.

예 : MyReadingsL.Sort (TheDelegate);

문제는 내가 할 수있는 각 속성에 대해 18 명의 대리인을 쓰고 싶지 않다는 것입니다. 에 대한 정렬이 가능합니다. 하나의 대리자, (MyReading x, MyReading y)를 수락하는 (비교 위임) 및 정렬 할 속성을 나타내는 문자열 일 수 있습니다.

어떻게 가능합니까?

+2

네, 가능하면 문자열에서 속성을 찾으려면 리플렉션을 사용해야 할 것입니다.하지만 값 비싼 메모리가 현명 할 수 있습니다. 비교 기능을 작성하거나 사용자가 정렬하려는 항목을 찾는 것이 가장 좋은 이유는 무엇입니까? – DGibbs

+0

네, 가능합니다. – James

+0

List 이 UI에 바인딩되는 이유는 무엇입니까? UI 컨트롤에서 사용할 수있는 것뿐만 아니라 DataGridView 등 – Ric

답변

3

매우 쉽습니다. 당신은 당신이 같은 방법으로 호출 외부 함수를 정의하려면

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

, 서명은 다음과 같아야합니다 :

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

가로 문자열에서 변환하기 위해 LINQ는 이미이 있습니다 속성에서 정적 데이터 멤버를 정의 할 수 있습니다.

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

질문의 핵심은 사용자 정의 문자열을 대리자로 변환하여 목록을 정렬 할 수있는 방법이라고 생각합니다. –

관련 문제