2013-07-30 2 views
5

람다 식 신속 접근을위한 사전 정의에 문제가 있습니다.C# 람다 사전 만들기

은의 우리가 같은 잘 알려진 클래스가 있다고 가정하자 :

class Example 
{ 
    public string Thing1; 
    public DateTime Thing2; 
    public int Thing3; 
} 

무엇을 할 찾는이 같은 것입니다 :

var getters = new Dictionary<string, IDontKnowWhatGoesHere>(); 
getters.Add("Thing1", x => x.Thing1); 
getters.Add("Thing3", x => x.Thing3); 

이 가능합니까?

편집 :

이이 개체에 대한 내 사용 사례입니다 : 당신의 도움에 대한

List<Example> array = new List<Example>(); 

// We actually get this variable set by the user 
string sortField = "Thing2"; 

array.Sort(getters[sortField]); 

많은 감사합니다.

+0

사전에 값 유형으로 'Func '을 (를) 저장하려고합니까? 이게 니가 원하는거야? 당신은 이것을 무엇을 위해 사용하려고합니까? – gunr2171

+0

그래서 표현식을 저장 하시겠습니까? – ne2dmar

+0

당신은 이것을 위해 무엇이 필요한지 말할 수 있습니까? 그러면 우리는 더 나은 해결책을 쓸 것입니다. – Epsilon

답변

8

몇 가지 옵션이 있습니다. 당신의 예에서와 같이, 당신이 얻을 할 것 (즉 String) 모두 같은 유형 인 경우에, 당신은 서로 다른 유형이라면, 당신은 가장 낮은 사용해야합니다, 그러나

var getters = new Dictionary<string, Func<Example, String>>(); 

을 수행 할 수 있습니다 Object 될 것입니다 대부분의 경우 일반적인 서브 클래스 : 당신이 다음 예상 유형으로 반환 값을 캐스팅해야합니다

var getters = new Dictionary<string, Func<Example, object>>(); 

참고.

+0

Linq 확장 OrderBy가 잘 작동합니까? –

+0

열쇠로, 네. 가치에 의해, 정말로 : 대표자는'IComparable'을 구현하지 않으므로, 당신은 당신 자신의'IComparer'를 작성할 필요가 있습니다. 그것이 당신의 의도라면'Dictionary >'처럼 표현식을 사용하는 것이 더 쉬울 수도 있지만 완전히 새로운 문제입니다. – RoadieRich

+0

잘못했다는 것을 유감스럽게 생각합니다. 목록 : ; a.OrderBy (getters [ "Thing1"]); 해결해야 할 문제는 거대한 스위치 케이스를 작성하지 않고 동적 OrderBy를 만드는 것입니다. 정렬 필드가 클라이언트 측에서옵니다. –

3

시도해보십시오 Func 대표의 첫 번째 제네릭 형식 매개 변수는 입력의 종류가

var getters = new Dictionary<string, Func<Example, object>>(); 
getters.Add("Thing1", x => x.Thing1); 
getters.Add("Thing3", x => x.Thing3); 

이고, 두 번째 제네릭 형식 매개 변수는 출력 (서로 다른 출력을했습니다 때문에 object를 사용의 유형입니다 유형). 더 Func에 대해 : Func<T, TResult> Delegate

3
var getters = new Dictionary<string, Expression<Func<Example, object>>>(); 

그러나, string Thing1 공개해야한다.

+0

이 경우이 방법이 효과가 있습니까? IEnumerable .OrderBy (getters [ "Thing1"]) –

1

나는 정말로 당신이 잘못된 생각으로 생각하고 있다고 생각합니다. 사전을 사용하는 이유는 무엇입니까? 클래스 정의가 올바른 경우 List<Example>을 사용하십시오.

List<Example> dataList = new List<Example>(); 
dataList.Add(new Example { Thing1 = "asdf", Thing2 = "qwert", Thing3 = 2 }); 

그러면 linq를 사용할 수 있습니다.

IEnumerable<Example> sortedByT3 = dataList.OrderBy(x => x.Thing3); 

sortedByT3.Last().Thing2 = "hjkl"; 

는 또한 Marc Gravell's answer에서 제공하는 dynamic order by 사용할 수 없습니다 :

var sortedByString = dataList.AsQueryable().OrderBy("Thing2"); 

람다에 대한 필요, 데이터에 바로 직접 액세스.

모두가 말했듯이 회원을 공개로 설정해야합니다.

public class Example 
{ 
    public string Thing1 { get; set; } 
    public string Thing2 { get; set; } 
    public int Thing3 { get; set; } 
} 
+0

네, 요점은 내가 처음으로 정렬하려는 필드를 알아야한다는 것입니다. 그래서 저는 고대 프로그래머들이 정상적으로했던 것처럼 큰 스위치 케이스를 만들 수 있습니다. 나는 그걸로 살 수 있지만 DLR, TypeInference, Generics, Lambdas가 나에게 다른 방법을 줄 수 있는지 알고 싶다. –

+0

@AdrianSalazar, 그래서'dynamic linq'와 같은 것? http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx – gunr2171

+0

네, 요점은 있지만, SQL에 전혀 연결되어 있지 않습니다 ... 나는 언젠가 세상을 구하고 메가 제너릭으로 만들고 싶지 않습니다. 이 특정 클래스에서 작동한다면 충분합니다. –