আপডেট 7/17/2012: দৃশ্যত সি # 5.0 হিসাবে, foreach
নীচে বর্ণিত আচরণগুলির পরিবর্তন করা হয়েছে এবং " একটি নেস্টেড ল্যাম্বডা এক্সপ্রেশনটিতে একটি foreach
পুনরাবৃত্তির পরিবর্তনশীল ব্যবহার আর অপ্রত্যাশিত ফলাফল আনবে না " "এই উত্তরটি সি # ≥ 5.0 তে প্রযোজ্য নয় ।
@ জন স্কিটি এবং যারা ভবিষ্যদ্বাণী কীওয়ার্ডটি পছন্দ করেন তারা সবাই।
৫.০ এর পূর্বে সি # তে "ফোরচ" এর সমস্যাটি হ'ল এটি অন্যান্য ভাষায় "বোঝার জন্য" সমতুল্য কীভাবে কাজ করে এবং আমি কীভাবে এটি কাজ করতে পারি তার সাথে অসঙ্গতিপূর্ণ (ব্যক্তিগত মতামত কেবল এখানে বর্ণিত কারণ অন্যরা তাদের উল্লেখ করেছেন পঠনযোগ্যতা সম্পর্কিত মতামত)। " পরিবর্তিত ক্লোজারে অ্যাক্সেস " এবং " ক্ষতিকারক হিসাবে বিবেচিত লুপ ভেরিয়েবলটি বন্ধ করা" সম্পর্কিত সমস্ত প্রশ্ন দেখুন । এটি কেবলমাত্র "ক্ষতিকারক" কারণ সি # তে "ভবিষ্যদ্বাণী" প্রয়োগ করা হয়।
@ ফ্রেড্রিক কালসেথের উত্তরটিতে কার্যত সমমানের সম্প্রসারণ পদ্ধতিটি ব্যবহার করে নিম্নলিখিত উদাহরণগুলি নিন।
public static class Enumerables
{
public static void ForEach<T>(this IEnumerable<T> @this, Action<T> action)
{
foreach (T item in @this)
{
action(item);
}
}
}
অত্যধিক স্বীকৃত উদাহরণের জন্য ক্ষমাপ্রার্থী। আমি কেবল পর্যবেক্ষণযোগ্য ব্যবহার করছি কারণ এটির মতো কিছু করার পক্ষে এটি পুরোপুরি খুব বেশি দূরে নেই। স্পষ্টতই এই পর্যবেক্ষণযোগ্য তৈরি করার আরও ভাল উপায় আছে, আমি কেবল একটি পয়েন্ট প্রদর্শন করার চেষ্টা করছি। সাধারণত পর্যবেক্ষণযোগ্য সদস্যতার জন্য সাবস্ক্রাইব করা কোডটি তাত্পর্যপূর্ণভাবে এবং সম্ভবত অন্য থ্রেডে কার্যকর করা হয়। যদি "ফরচ" ব্যবহার করা হয় তবে এটি খুব বিস্ময়কর এবং সম্ভাব্য অ-নির্জনবাদী ফলাফল আনতে পারে।
"ফরইচ" এক্সটেনশন পদ্ধতি ব্যবহার করে নিম্নলিখিত পরীক্ষাটি পাস করে:
[Test]
public void ForEachExtensionWin()
{
//Yes, I know there is an Observable.Range.
var values = Enumerable.Range(0, 10);
var observable = Observable.Create<Func<int>>(source =>
{
values.ForEach(value =>
source.OnNext(() => value));
source.OnCompleted();
return () => { };
});
//Simulate subscribing and evaluating Funcs
var evaluatedObservable = observable.ToEnumerable().Select(func => func()).ToList();
//Win
Assert.That(evaluatedObservable,
Is.EquivalentTo(values.ToList()));
}
নিম্নলিখিত ত্রুটিটি ব্যর্থ:
প্রত্যাশিত: <0, 1, 2, 3, 4, 5, 6, 7, 8, 9> এর সমান তবে এটি ছিল: <9, 9, 9, 9, 9, 9, 9, 9, 9, 9>
[Test]
public void ForEachKeywordFail()
{
//Yes, I know there is an Observable.Range.
var values = Enumerable.Range(0, 10);
var observable = Observable.Create<Func<int>>(source =>
{
foreach (var value in values)
{
//If you have resharper, notice the warning
source.OnNext(() => value);
}
source.OnCompleted();
return () => { };
});
//Simulate subscribing and evaluating Funcs
var evaluatedObservable = observable.ToEnumerable().Select(func => func()).ToList();
//Fail
Assert.That(evaluatedObservable,
Is.EquivalentTo(values.ToList()));
}
ForEach()
।