2008-08-26 12 views
42

सी # में छिपा सुविधाओं लेकिन बहुत से लोगों को लिखा है LINQ/lambdas उदाहरण तो ... मुझे आश्चर्य है कि बारे में एक पोस्ट देखा ...कूलस्ट सी # LINQ/Lambdas चाल जो आपने कभी खींचा है?

क्या है सबसे अच्छे का उपयोग (सबसे सुंदर के रूप में) सी # LINQ और/या Lambdas/अनाम प्रतिनिधि जो आपने कभी देखा/लिखा है?

बोनस अगर यह उत्पादन में भी चला गया है!

उत्तर

27

LINQ Raytracer निश्चित रूप से मेरी सूची में सबसे ऊपर =)

मैं काफी यकीन है कि सुंदर के रूप में उत्तीर्ण अगर नहीं कर रहा हूँ, लेकिन यह सबसे निश्चित रूप से सबसे अच्छे LINQ अभिव्यक्ति मैंने आज तक देखा है!

ओह, और बस बेहद स्पष्ट होना; मैंने लिखा है (Luke Hoban किया)

+1

एसक्यूएल में Madlebrot की मुझे याद दिलाता है: http://thedailywtf.com/Articles/Stupid-Coding-Tricks-The-TSQL-Madlebrot.aspx – RHSeeger

+0

मैं ल्यूक, जहां के साथ एक पॉडकास्ट सुना वह कह रहे थे कि उन्होंने एक नई भाषा के बाहर "परीक्षण" करने के लिए रे ट्रेसर लिखना इस्तेमाल किया था। तो जब LINQ वह साथ आया था बस यह करने के लिए अपने मानक "परीक्षण" आवेदन किया, और LINQ Raytracer पैदा हुआ था। –

1

मैं एक वेबसाइट के निर्माण के लिए नेविगेशन नियंत्रण बनाने के लिए एक शानदार तरीका के साथ आने का प्रयास कर रहा था। मैं नियमित एचटीएमएल अनॉर्डर्ड सूची तत्वों का उपयोग करना चाहता था (मानक CSS "Sucker Fish" look को नियोजित करना) शीर्ष-नेविगेशन माउस-ओवर प्रभाव के साथ जो ड्रॉप डाउन आइटम का खुलासा करता है। मेरे पास दो टेबल (नेविगेशन टोपलेवल & नेविगेशनबॉटमलेवल) के साथ एक एसक्यूएल आश्रित कैश डेटासेट था। तब मुझे कुछ आवश्यक गुणों के साथ दो वर्ग वस्तुओं (टॉपनाव & सबनाव) बनाना था (टॉपनाव क्लास में तलनाव वस्तुओं की एक सामान्य सूची थी -> सूची < सबनाव > सबइटम)।

 

var TopNavs = from n in ds.NavigationTopLevels select new TopNav { NavigateUrl = String.Format("{0}/{1}", tmpURL, n.id), Text = n.Text, id = n.id, SubItems = new List<SubNav>( from si in ds.NavigationBottomLevels where si.parentID == n.id select new SubNav { id = si.id, level = si.NavLevel, NavigateUrl = String.Format("{0}/{1}/{2}", tmpURL, n.id, si.id), parentID = si.parentID, Text = si.Text } ) }; List<TopNav> TopNavigation = TopNavs.ToList();

यह नहीं हो सकता है "सबसे अच्छे" लेकिन लोग हैं, जो गतिशील नेविगेशन करना चाहते हैं की एक बहुत कुछ के लिए, उसका मीठा सामान्य पाशन तर्क यह है कि के साथ आता है में चारों ओर अव्यवस्था करने के लिए नहीं। LINQ है, अगर इस मामले में कुछ समय बचा है।

20

कुछ बुनियादी functionals:

public static class Functionals 
{ 
    // One-argument Y-Combinator. 
    public static Func<T, TResult> Y<T, TResult>(Func<Func<T, TResult>, Func<T, TResult>> F) 
    { 
     return t => F(Y(F))(t); 
    } 

    // Two-argument Y-Combinator. 
    public static Func<T1, T2, TResult> Y<T1, T2, TResult>(Func<Func<T1, T2, TResult>, Func<T1, T2, TResult>> F) 
    { 
     return (t1, t2) => F(Y(F))(t1, t2); 
    } 

    // Three-arugument Y-Combinator. 
    public static Func<T1, T2, T3, TResult> Y<T1, T2, T3, TResult>(Func<Func<T1, T2, T3, TResult>, Func<T1, T2, T3, TResult>> F) 
    { 
     return (t1, t2, t3) => F(Y(F))(t1, t2, t3); 
    } 

    // Four-arugument Y-Combinator. 
    public static Func<T1, T2, T3, T4, TResult> Y<T1, T2, T3, T4, TResult>(Func<Func<T1, T2, T3, T4, TResult>, Func<T1, T2, T3, T4, TResult>> F) 
    { 
     return (t1, t2, t3, t4) => F(Y(F))(t1, t2, t3, t4); 
    } 

    // Curry first argument 
    public static Func<T1, Func<T2, TResult>> Curry<T1, T2, TResult>(Func<T1, T2, TResult> F) 
    { 
     return t1 => t2 => F(t1, t2); 
    } 

    // Curry second argument. 
    public static Func<T2, Func<T1, TResult>> Curry2nd<T1, T2, TResult>(Func<T1, T2, TResult> F) 
    { 
     return t2 => t1 => F(t1, t2); 
    } 

    // Uncurry first argument. 
    public static Func<T1, T2, TResult> Uncurry<T1, T2, TResult>(Func<T1, Func<T2, TResult>> F) 
    { 
     return (t1, t2) => F(t1)(t2); 
    } 

    // Uncurry second argument. 
    public static Func<T1, T2, TResult> Uncurry2nd<T1, T2, TResult>(Func<T2, Func<T1, TResult>> F) 
    { 
     return (t1, t2) => F(t2)(t1); 
    } 
} 

बहुत अच्छा मत करो अगर आप उन्हें कैसे उपयोग करने के लिए पता नहीं है। लंबी चलने वाली LINQ प्रश्नों के लिए

+3

यह अभी भी .NET मानक कार्यक्षमता क्यों नहीं है? –

+0

पिन() LINQ विस्तार विधि की तरह लग रहा। – Larry

11

Progress Reporting: आदेश है कि पता करने के लिए, आप को पता है कि वे क्या कर रहे हैं की जरूरत है। ब्लॉग पोस्ट में आप एक विस्तार विधि WithProgressReporting() ढूंढ सकते हैं जो आपको एक linq क्वेरी की प्रगति की खोज और रिपोर्ट करने देता है क्योंकि यह निष्पादित होता है।

3

मेरी डिजाइन लेकिन मैं इसे कई बार, एक टाइप किया स्विच बयान का उपयोग किया है: http://community.bartdesmet.net/blogs/bart/archive/2008/03/30/a-functional-c-type-switch.aspx

सहेजा मुझे इतने सारे हैं ... किसी और यदि किसी और ... अगर किसी और अगर ...! बयान

+0

वाह! हमेशा क्या ppl के साथ प्रभावित w/यह 555 शायद हम एक टाइप किया दुनिया में रहते हैं बहुत ज्यादा आया। – chakrit

+1

लॉल। बेशक हमेशा polymorphism है :-) – Stimul8d

1

मुझे लगता है कि LINQ .NET में एक बड़ा परिवर्तन है और यह एक बहुत ही शक्तिशाली टूल है।

मैं कोड में दो पंक्तियों में एक डेटासेट में 6 एमबी एक्सएमएल फ़ाइल (20+ नोड स्तर के साथ) से रिकॉर्ड और फ़िल्टर करने के लिए उत्पादन में LINQ से XML का उपयोग करता हूं।

LINQ से पहले यह सैकड़ों लाइनों को कोड और दिन डीबग करने के लिए ले जाएगा।

यही वह है जिसे मैं सुरुचिपूर्ण कहता हूं! http://www.aaron-powell.com/linq-to-xml-to-excel

+0

यह सुनिश्चित है कि :-) मैं इसे प्यार करता हूँ। – chakrit

+0

मुझे आश्चर्य है कि हमें इस तरह की तकनीक के लिए इस लंबे समय तक इंतजार क्यों करना पड़ा? – kahoon

3

वास्तव में, मैं एक्सेल docments पैदा करने के लिए यह काफी गर्व कर रहा हूँ

private void WriteMemberDescriptions(Type type) 
{ 
    var descriptions = 
     from member in type.GetMembers() 
     let attributes = member.GetAttributes<DescriptionAttribute>(true) 
     let attribute = attributes.FirstOrDefault() 
     where attribute != null 
     select new 
     { 
      Member = member.Name, 
      Text = attribute.Description 
     }; 

     foreach(var description in descriptions) 
     { 
      Console.WriteLine("{0}: {1}", description.Member, description.Text); 
     } 
} 

GetAttributes विस्तार विधि:

public static class AttributeSelection 
{ 
    public static IEnumerable<T> GetAttributes<T>(this ICustomAttributeProvider provider, bool inherit) where T : Attribute 
    { 
     if(provider == null) 
     { 
      throw new ArgumentNullException("provider"); 
     } 

     return provider.GetCustomAttributes(typeof(T), inherit).Cast<T>(); 
    } 
} 

AttributeSelection उत्पादन कोड है और GetAttribute और HasAttribute को भी परिभाषित करता है। मैंने इस उदाहरण में let और where क्लॉज का उपयोग करना चुना है।

+0

लिंक अब सक्रिय नहीं है? – asgerhallas

+0

@asgerhallas - मैंने अपनी अद्यतन वेबसाइट पर यह लिंक अपडेट किया है –

0

विशेषताओं के साथ कार्य करना:

16

अभी तक सबसे प्रभावशाली Linq कार्यान्वयन मैं कभी का सामना करना पड़ा ब्रह्मा है ढांचा।

इसका उपयोग 'लिंक से GPU' का उपयोग करके GPU के समानांतर गणना को ऑफ़लोड करने के लिए किया जा सकता है। आप linq में 'क्वेरी' लिखते हैं, और फिर ब्रह्मा इसे एचएलएसएल (हाई लेवल शेडर लैंग्वेज) में अनुवादित करता है, इसलिए डायरेक्टएक्स इसे GPU पर संसाधित कर सकता है। आप सही पृष्ठों मिल जाएगा

http://www.dotnetrocks.com/default.aspx?showNum=466

वरना ब्रह्मा परियोजना के लिए गूगल,:

यह साइट केवल मुझे इतना dotnetrocks से इस वेबकास्ट की कोशिश एक लिंक पेस्ट करने देगा।

बेहद अच्छी चीजें।

जी जे

+0

+1: पवित्र सीआर @ पी! वह तो कमाल है। और बुराई। बहुत बुरा। –

4

मेरे लिए, प्रतिनिधियों (Func<T,R>, Action<T>) और भाव (Expression<Func<T,R>>Expression<Action<T>>) के बीच द्वंद्व क्या lambdas के सबसे चतुर उपयोग करता है को जन्म देता है है।

उदाहरण के लिए:

public static class PropertyChangedExtensions 
{ 
    public static void Raise(this PropertyChangedEventHandler handler, Expression<Func<object>> propertyExpression) 
    { 
     if (handler != null) 
     { 
      // Retrieve lambda body 
      var body = propertyExpression.Body as MemberExpression; 
      if (body == null) 
       throw new ArgumentException("'propertyExpression' should be a member expression"); 

      // Extract the right part (after "=>") 
      var vmExpression = body.Expression as ConstantExpression; 
      if (vmExpression == null) 
       throw new ArgumentException("'propertyExpression' body should be a constant expression"); 

      // Create a reference to the calling object to pass it as the sender 
      LambdaExpression vmlambda = Expression.Lambda(vmExpression); 
      Delegate vmFunc = vmlambda.Compile(); 
      object vm = vmFunc.DynamicInvoke(); 

      // Extract the name of the property to raise a change on 
      string propertyName = body.Member.Name; 
      var e = new PropertyChangedEventArgs(propertyName); 
      handler(vm, e); 
     } 
    } 
} 

तो फिर तुम "सुरक्षित रूप से" INotifyPropertyChanged लागू कर सकते हैं

बुला
if (PropertyChanged != null) 
    PropertyChanged.Raise(() => MyProperty); 

नोट से: मैं पहले कुछ सप्ताह पहले वेब पर देखा, तो लिंक खो दिया और तब से भिन्नता का स्कोर यहां और वहां बढ़ गया है इसलिए मुझे डर है कि मैं उचित विशेषता नहीं दे सकता।

1
नहीं

शायद सबसे अच्छे है, लेकिन हाल ही में मैं उन्हें उपयोग किया गया है किसी भी समय मुझे लगता है कि सी + पी.डी. बार बार हो जाता है केवल कुछ पंक्तियों में परिवर्तन करने के लिए कोड का एक खंड है। उदाहरण के लिए, सरल एसक्यूएल चल पुनः प्राप्त करने के डेटा इसलिए की तरह किया जा सकता है आदेश:

SqlDevice device = GetDevice(); 

return device.GetMultiple<Post>(
    "GetPosts", 
    (s) => { 
     s.Parameters.AddWithValue("@CreatedOn", DateTime.Today); 

     return true; 
    }, 
    (r, p) => { 
     p.Title = r.Get<string>("Title"); 

     // Fill out post object 

     return true; 
    } 
); 

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

0

OLINQ INotifyingCollection से अधिक प्रतिक्रियाशील LINQ प्रश्नों - इन आप बड़े डेटासेट के खिलाफ (अन्य बातों के साथ) करने के लिए वास्तविक समय एकत्रीकरण अनुमति देते हैं।

https://github.com/wasabii/OLinq

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