2009-02-04 13 views
20

LINQ, प्रोग्रामिंग समस्याओं का एक बहुत अधिक आसानी से हल किया जा सकता के साथ - और कोड के कम लाइनों में।अपने पसंदीदा LINQ करने वाली वस्तुएँ प्रश्नों

कुछ बेहतरीन वास्तविक दुनिया LINQ-to-Objects आपके द्वारा लिखे गए प्रश्न क्या हैं?

(सर्वश्रेष्ठ = सादगी & सी # 2.0/अनिवार्य दृष्टिकोण की तुलना में लालित्य)।

+0

एक बहुत अच्छा सवाल है, लेकिन मुझे लगता है कि इसे विकृत किया जाना चाहिए। – GvS

उत्तर

0

मुझे शुरू कर दिया गया और उसके भयानक!

var myList = from list in myObjectList select list 
+0

क्षमा करें, मुझे विचार नहीं मिल रहा है। इस उदाहरण के बारे में इतना खास क्या है? – Matt

+0

@ मैट 7 साल पहले यह बहुत साफ था। –

+0

@ मैट क्योंकि यह एक बहुत ही सरल, अभी तक शक्तिशाली था, सूची में तेजी से पुन: प्रयास करने का तरीका था। वहां से, यह जोड़ना आसान है कि क्लॉज, आदि को _really_ को कुछ शानदार परिणाम मिलते हैं। कोड पढ़ने के लिए स्वच्छ और सरल होगा। –

8

किसी सूची में शून्य आइटम को फ़िल्टर करें।

var nonnull = somelist.Where(a => a != null); 

एक शब्दकोश जहां कुंजी एक संपत्ति के मूल्य है बनाएँ, और मूल्य समय की संख्या है कि संपत्ति सूची में दिखाई देता है।

var countDictionary = somelist 
    .GroupBy(a => a.SomeProperty) 
    .ToDictionary(g => g.Key, g => g.Count()); 
+3

'somelist.Where (a => a! = Null) 'somelist.OfType ()' – Gabe

4

LINQ केवल सी #/वीबी के लिए कुछ कार्यात्मक प्रोग्रामिंग अवधारणाओं का जोड़ा है। इसलिए, हाँ, सबसे बातें बहुत आसान प्राप्त करते हैं। सूची की प्रक्रिया देखें, उदाहरण के लिए - सी # 2.0 वास्तव में इस में से कुछ था। (हालांकि, में गुमनाम विधि वाक्य रचना सी # 2.0 भी वर्बोज़ था।)

यहाँ एक छोटे से उदाहरण है:

static readonly string badChars = "[email protected]#$%^&*()"; 
bool IsUserNameValid(string userName) { 
    return userName.Intersect(badChars).Any(); 
} 
1

आप एक सूची है (अर्थात List<Palette> palettes) है कि जिन वस्तुओं पर एक और सूची है शामिल है (यानी Palette.Colors) और एक में उन सभी उप-सूचियों समतल करना चाहते हैं:

List<Color> allColors = palettes.SelectMany(p => p.Colors); 
3

उदाहरण 1

आर स्थानीय नेटवर्क नई फ़ाइल

private string NewName(string newNamePrefix, List<string> existingFileNames) 
{ 
    return newNamePrefix + 
     (existingFileNames. 
      Select 
      (
       n => 
       { 
        if (n.StartsWith(newNamePrefix)) 
        { 
         int i; 
         if (int.TryParse(n.Replace(newNamePrefix, ""), out i)) 
          return i; 
        } 

        return 0; 
       } 
      ). 
      OrderBy(i => i). 
      Last() + 1 
     ); 
} 
+0

से थोड़ा कम कुशल है, आपको पहले उदाहरण के लिए किस संदर्भ की आवश्यकता है? मैंने इसे लिंककैड में आजमाया है लेकिन इसमें एक असेंबली संदर्भ गुम है। – Matt

2

के लिए

private List<string> GetServerNames() 
{ 
    return SqlDataSourceEnumerator.Instance.GetDataSources().Rows. 
     Cast<DataRow>(). 
     Select 
     (
      row => row["ServerName"].ToString() + 
        (row["InstanceName"] != DBNull.Value ? "\\" + row["InstanceName"].ToString() : "") + 
        (row["Version"] != DBNull.Value ? " (" + row["Version"].ToString().Substring(0, 3) + ")" : "") 
     ). 
     OrderBy(s => s). 
     ToList(); 
} 

उदाहरण 2

इस्तेमाल नहीं किया उत्पन्न नाम के भीतर SQL सर्वर के सभी उपलब्ध उदाहरणों के नाम के साथ सूची eturns मेरे पास दो अच्छी तरह से बेतुका लेकिन सुरुचिपूर्ण उदाहरण जिन्हें मैं

public static IEnumerable<bool> Information(this byte x) 
{ 
    return Enumerable.Range(0, 8).Select(i => ((x >> i) & 1) == 1); 
} 

public static IEnumerable<bool> Information(this IEnumerable<byte> xs) 
{ 
    return xs.SelectMany(Information); 
} 

इन देरी क्वेरी ऑपरेटर के रूप में समाहित हैं ताकि आप उन्हें पुन: उपयोग कर सकते हैं, उदाहरण के लिए द्विआधारी पार्स

var n = bytes.Information().Skip(3).Take(16).ToInt(); 
+0

मुझे लगता है - यह एक ToBits() फ़ंक्शन है। अच्छा लगा। –

+0

हां; मैं नाम की जानकारी पसंद करता हूं क्योंकि जानकारी की सबसे छोटी इकाई थोड़ी सी है। हालांकि यह एक विस्तार संपत्ति होनी चाहिए, लेकिन हमारे पास अभी तक नहीं है। –

2

के लिए आप एक सीमांकित Name=Value स्ट्रिंग, जैसे "ID=2;Name=James;Age=32;" है और आप एक शब्दकोश में इस बारी करने के लिए जल्दी चाहते हैं, आप उपयोग कर सकते हैं:

var dict = value.Split(new[] { ";" }, StringSplitOptions.RemoveEmptyEntries) 
    .Select(str => str.Split('=')) 
    .ToDictionary(pair => pair[0], pair => pair[1]); 
0

मैं पाठ पर LINQ का उपयोग करना चाहते जब मैं कर रहा हूँ पोर्टिंग कोड:

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

String.Join("\n", @"some VB6 code 
    that I could refactor automatically 
    if FindAndReplace were a bit more powerfully 
    And I don't want to refactor by hand".Split('\n').Trim().Select(line => 
    { 
     if(line.Contains("FindAndReplace") && !line.StartsWith("//")) 
     { 
      return line.Split(" ").Last(); 
     } 
     else 
     { 
      return String.Join("_", line.Split(" ").Take(3)); 
     } 
    }); 

आप अंदाजा हो।लिंक मुझे पाठ परिवर्तन में सी # की पूर्ण शक्ति लागू करने देता है। आमतौर पर मैं इसका इस्तेमाल जब मैं एक भाषा में कोड है कि मैं निकालने और एक जटिल तरीके से हेरफेर करना चाहते है, मैं LINQPad में अकेले पाठ फेंक और एक उद्धरण चिह्नों पर "खोज-की जगह" करते हैं, उन्हें दोहरे उद्धरण चिह्न के साथ की जगह है, तो मैं इसे @"..." से घिरा हुआ हूं और काम पर जाता हूं। मैं आमतौर पर 30 सेकंड या उससे भी अधिक में बड़े पैमाने पर कोड परिवर्तन कर सकता हूं।

0

मेरा पसंदीदा गतिशील Northwind डेटाबेस से किसी SQL तालिका छँटाई निम्नलिखित Linq उदाहरण है:

void Main() 
{ 

// Demonstrates dynamic ordering 

var SortExpression = "Total"; // choose ProductName or Total 
var sortAscending = true; // choose true for ascending, false for descending 

// the query to sort 
var data = (from pd in Products 
        join od in OrderDetails on pd.ProductID equals od.ProductID into DetailsByProduct 
        select new { ProductName = pd.ProductName, Total = DetailsByProduct.Count()}).ToList(); 

// the data source you can use for data binding      
var ds= (sortAscending) 
    ? data.OrderBy(x => x.GetType().GetProperty(SortExpression).GetValue(x, null)) 
    : data.OrderByDescending(x => x.GetType().GetProperty(SortExpression).GetValue(x, null)); 

ds.Dump(); 
} 

यह अनुमति देता है आप के लिए गतिशील रूप से तरह बस चर SortExpression और एक तरह से क्रम में एक क्षेत्र को निर्दिष्ट करके परिवर्तनीय sortAscending में।

.Take(x) और .Skip(y) का उपयोग कर आप के रूप में अच्छी आसानी से पेजिंग लागू कर सकते हैं के द्वारा।

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