2008-11-25 12 views
14

संभव डुप्लिकेट: IEnumerable के लिए
LINQ equivalent of foreach for IEnumerable<T>मौजूदा LINQ एक्सटेंशन विधि समानांतर के समान है। के लिए?

LINQ विस्तार तरीके हैं बहुत आसान है ... लेकिन ऐसा नहीं है कि उपयोगी अगर सभी आप क्या करना चाहते में प्रत्येक आइटम के लिए कुछ गणना लागू है कुछ भी वापस किए बिना गणना। तो मैं सोच रहा था कि शायद मुझे सही विधि याद आ रही है, या यदि यह वास्तव में अस्तित्व में नहीं है क्योंकि मैं उपलब्ध है तो एक अंतर्निहित संस्करण का उपयोग करना चाहूंगा ... लेकिन मुझे कोई नहीं मिला :-)

मैं शपथ ले सकता था कि कहीं भी एक विधि है, लेकिन मुझे अभी तक यह नहीं मिला है। इस बीच, मैं इस मामले में अपने खुद के संस्करण लिख था कि यह किसी और के लिए उपयोगी होता है:

using System.Collections; 
using System.Collections.Generic; 

public delegate void Function<T>(T item); 
public delegate void Function(object item); 

public static class EnumerableExtensions 
{ 
    public static void For(this IEnumerable enumerable, Function func) 
    { 
     foreach (object item in enumerable) 
     { 
      func(item); 
     } 
    } 

    public static void For<T>(this IEnumerable<T> enumerable, Function<T> func) 
    { 
     foreach (T item in enumerable) 
     { 
      func(item); 
     } 
    } 
} 

उपयोग है:

myEnumerable.For<MyClass>(delegate(MyClass item) { item.Count++; });

+5

सीएफ एरिक Lippert का जवाब यहाँ: http://blogs.msdn.com/ericlippert/archive/2009 /05/18/foreach-vs-foreach.aspx – Benjol

उत्तर

15

क्यों इस पर कुछ अधिक प्रकाश से छुटकारा पाना:

LINQ प्रकृति में कार्यात्मक है। इसका उपयोग डेटा पूछने और परिणामों को वापस करने के लिए किया जाता है। एक LINQ क्वेरी को एप्लिकेशन की स्थिति में बदलाव नहीं करना चाहिए (कैशिंग जैसे कुछ अपवादों के साथ)। क्योंकि foreach कोई परिणाम नहीं लौटाता है, इसमें कई उपयोग नहीं होते हैं जिनमें आप जो कुछ भी गुजर रहे हैं उसके अलावा किसी चीज की स्थिति को बदलने में शामिल नहीं होते हैं। और यदि आपको Foreach() एक्सटेंशन विधि की आवश्यकता है, तो यह है अपना खुद का रोल करना आसान है।

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

उदाहरण के लिए, निम्नलिखित कोड एक सूची में हर आइटम पर एक समारोह प्रतिनिधि कॉल करता है, तो है कि आइटम सकारात्मक है सच लौटने:

static void Main(string[] args) 
    { 
     IEnumerable<int> list = new List<int>() { -5, 3, -2, 1, 2, -7 }; 
     IEnumerable<bool> isPositiveList = list.Select<int, bool>(i => i > 0); 

     foreach (bool isPositive in isPositiveList) 
     { 
      Console.WriteLine(isPositive); 
     } 

     Console.ReadKey();   
    } 
+2

http://stackoverflow.com/questions/858978/lambda-expression-using-foreach-clause और http://blogs.msdn.com/b/ericlippert/archive/2009/05/18/foreach- पर पुष्टि देखें बनाम foreach.aspx –

3

foreach विधि List<T> पर करता है। आप अपने संग्रह को एक सूची में लपेट सकते हैं और फिर उस कॉल का उपयोग कर सकते हैं, लेकिन यह वास्तव में करने के लिए एक अच्छी बात नहीं है। ऐसा लगता है कि आपको अपना खुद का रोल करना होगा।

+0

नहीं, जब तक कि मुझे कुछ याद नहीं आ रहा है, वहां कोई नहीं है। प्रत्येक विधि –

+0

मैंने अपना जवाब समायोजित किया क्योंकि फॉरएच सूची पर है <>। –

-1

पहले से ही here और there पर चर्चा की गई है।

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

9

वास्तव में, माइक्रोसॉफ्ट रिसर्च से रिएक्टिव एक्सटेंशन ढांचा इस कार्यक्षमता जोड़ने किया था। System.Interactive असेंबली में उन्होंने Run() और Do() एक्सटेंशन IEnumerable<T> में शामिल किए हैं।

क्या करें (कार्रवाई) प्रत्येक तत्व पर कार्रवाई निष्पादित करेगा और इसे वापस लाएगा।यह उदाहरण के लिए एक LINQ क्वेरी के लिए लॉगिंग जोड़ने के लिए उपयोगी है:

var res = GetRandomNumbers(100).Take(10) 
     .Do(x => Console.WriteLine("Source -> {0}", x)) 
     .Where(x => x % 2 == 0) 
     .Do(x => Console.WriteLine("Where -> {0}", x)) 
     .OrderBy(x => x) 
     .Do(x => Console.WriteLine("OrderBy -> {0}", x)) 
     .Select(x => x + 1) 
     .Do(x => Console.WriteLine("Select -> {0}", x)); 

यह परिणाम होगा में:

Source -> 96 
Where -> 96 
Source -> 25 
Source -> 8 
Where -> 8 
Source -> 79 
Source -> 25 
Source -> 3 
Source -> 36 
Where -> 36 
Source -> 51 
Source -> 53 
Source -> 81 
OrderBy -> 8 
Select -> 9 
9 
OrderBy -> 36 
Select -> 37 
37 
OrderBy -> 96 
Select -> 97 
97 

भागो (कार्रवाई) एक foreach पाश, अपने अनुक्रम तह जिसका मतलब है की तरह है जो कार्रवाई को निष्पादित करता है।

आप यहाँ इसके बारे में अधिक पढ़ सकते हैं: http://community.bartdesmet.net/blogs/bart/archive/2009/12/26/more-linq-with-system-interactive-the-ultimate-imperative.aspx

आरएक्स ढांचे यहां पाया जा सकता: http://msdn.microsoft.com/en-us/devlabs/ee794896.aspx

+0

मुझे लगता है कि यह सराहना की है। – Den

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