2013-07-30 6 views
5

मुझे लैम्ब्डा अभिव्यक्तियों तक त्वरित पहुंच के लिए एक शब्दकोश परिभाषित करने में समस्या आ रही है।सी # लैम्ब्डास का एक शब्दकोश बनाएं

की हम इस तरह एक प्रसिद्ध वर्ग है लगता है:

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

लिंक एक्सटेंशन एक्सटेंशन ऑर्डर इस पर अच्छा काम करेगा? –

+0

कुंजी से, हां। मूल्य से, वास्तव में नहीं: प्रतिनिधि 'आईसीओम्पेर्बल' लागू नहीं करते हैं, इसलिए आपको अपना 'आईसीओएमपेयर' लिखना होगा। यदि यह आपका इरादा है, तो आपको अभिव्यक्तियों का उपयोग करना आसान हो सकता है, जैसे 'शब्दकोश <स्ट्रिंग, अभिव्यक्ति >' - लेकिन यह एक पूरी नई समस्या है। – RoadieRich

+0

मुझे खेद है कि आपको गलत मिला, मैं यह करना चाहता हूं: सूची ए; a.OrderBy (getters [ "Thing1"]); मुझे जिस समस्या को हल करने की आवश्यकता है वह मेगा भारी स्विच केस लिखने के बिना गतिशील ऑर्डरबी बनाना है। क्रमबद्ध क्षेत्र क्लाइंट-साइड –

3

प्रयास करें:

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

Func प्रतिनिधि के पहले सामान्य प्रकार पैरामीटर निवेश के प्रकार, और दूसरा सामान्य प्रकार पैरामीटर निर्गम (object उपयोग करें, क्योंकि आप अलग अलग उत्पादन किया है के प्रकार है प्रकार)। अधिक Func के बारे में: Func<T, TResult> Delegate

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

हालांकि, string Thing1 सार्वजनिक किया जाना चाहिए।

+0

क्या यह इस मामले में अच्छा काम करेगा? IENumerable । ऑर्डर बी (गेटर्स ["थिंग 1"]) –

1

मुझे सच में लगता है कि आप गलत तरीके से इस बारे में सोच रहे हैं। एक शब्दकोश का उपयोग क्यों करें? यदि आपकी कक्षा परिभाषा सही है, तो बस List<Example> का उपयोग करें।

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

फिर आप उस पर linq का उपयोग कर सकते हैं। , Lambdas के लिए कोई ज़रूरत नहीं डेटा के लिए सिर्फ सीधी पहुँच

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

:

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

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

तुम भी एक dynamic order byMarc Gravell's answer द्वारा प्रदान का उपयोग कर सकते हैं।

जैसा कि सभी ने कहा है, आपको सदस्यों को सार्वजनिक करने की आवश्यकता है। मैं सुझाव दूंगा कि आप इसे निम्न में बदल दें:

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

हां मुझे तुम्हारा मुद्दा मिलता है, बात यह है कि मुझे यह जानने की जरूरत है कि मैं किस क्षेत्र में पहली बार सॉर्ट करना चाहता हूं। इसलिए मैं अपने बड़े प्रोग्रामर की तरह एक बड़ा स्विच केस कर सकता हूं। मैं इसके साथ रह सकता हूं, लेकिन मैं जानना चाहता हूं कि क्या डीएलआर, टाइपइंफर, जेनेरिक और लैम्बडास मुझे ऐसा करने का एक और तरीका दे सकते हैं। –

+0

@AdrianSalazar, तो कुछ 'गतिशील linq' की तरह? http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx – gunr2171

+0

हां आपको मेरा अंक मिला, लेकिन मैं मैं एसक्यूएल से बिल्कुल जुड़ा नहीं हूं ... और मैं एक दिन में दुनिया को बचाने और इसे मेगा-जेनेरिक बनाना नहीं चाहता हूं। यदि यह इस विशेष वर्ग के साथ काम करता है, तो यह पर्याप्त है। –

संबंधित मुद्दे