আপনি কীভাবে পূর্বাঞ্চলীয় লুপের বর্তমান পুনরাবৃত্তির সূচক পাবেন?


937

একটি পূর্বাঞ্চলীয় লুপের বর্তমান পুনরাবৃত্তির প্রতিনিধিত্ব করার মান পাওয়ার জন্য সি # তে কি এমন কিছু বিরল ভাষার কন্সট্রাকচারের মুখোমুখি হইনি (আমি সম্প্রতি কয়েকটি শিখেছি, কিছু স্ট্যাক ওভারফ্লোতে)?

উদাহরণস্বরূপ, আমি বর্তমানে পরিস্থিতির উপর নির্ভর করে এরকম কিছু করি:

int i = 0;
foreach (Object o in collection)
{
    // ...
    i++;
}

1
ফোরচ কাস্টিং পুনরুদ্ধারটি সাধারণত কোনও সংগ্রহের উপর সূচক-ভিত্তিক অ্যাক্সেস ব্যবহারের চেয়ে আমার কাছে বেশি অনুকূলিত হয় না যদিও অনেক ক্ষেত্রে এটি সমান হবে। পূর্বাচনের উদ্দেশ্যটি হল আপনার কোডটি পঠনযোগ্য, তবে এটি (সাধারণত) ইন্ডিয়ারেশনের একটি স্তর যুক্ত করে, যা নিখরচায় নয়।
ব্রায়ান

8
আমি বলব এর প্রাথমিক উদ্দেশ্য foreachহ'ল তারা সংগ্রহযোগ্য ( List) বা না ( Dictionary) এর নির্বিশেষে সমস্ত সংগ্রহের জন্য একটি সাধারণ পুনরাবৃত্তি ব্যবস্থা সরবরাহ করা ।
ব্রায়ান গিডন

2
হাই ব্রায়ান গিদিওন - অবশ্যই সম্মত হন (এটি কয়েক বছর আগে ছিল এবং আমি তখন অনেক কম অভিজ্ঞ ছিলাম)। যাইহোক, যখন Dictionaryসূচকযোগ্য নয়, এর একটি পুনরাবৃত্তি Dictionaryএটি একটি নির্দিষ্ট ক্রমে বিভ্রান্ত করে (যেমন একটি এনুম্যুরেটর যথাক্রমে উপাদানগুলি উত্পাদন করে তা সূচকযোগ্য)। এই অর্থে, আমরা বলতে পারি যে আমরা সংগ্রহের মধ্যে সূচকটি খুঁজছি না, বরং পরিবর্তকের মধ্যে বর্তমান গণিত উপাদানের সূচকটি (যেমন আমরা প্রথম বা পঞ্চম বা শেষের গণিত উপাদানের মধ্যে থাকি)।
ম্যাট মিচেল

4
foreach এছাড়াও সংকলক সংকলিত কোডে প্রতিটি অ্যারে অ্যাক্সেস পরীক্ষা করে সীমানা এড়িয়ে যেতে অনুমতি দেয়। একটি সূচক সহ ব্যবহার করা আপনার সূচি অ্যাক্সেস নিরাপদ কিনা তা রানটাইম যাচাই করবে।
IvoTops

1
তবে এটা মিথ্যা। যদি আপনি লুপের মধ্যে একটির জন্য পুনরাবৃত্তির পরিবর্তনশীল পরিবর্তন না করেন তবে সংকলকটি তার সীমানা কী তা জানে এবং সেগুলি আবার পরীক্ষা করার প্রয়োজন নেই। এটি এমন একটি সাধারণ ঘটনা যে কোনও শালীন সংকলক এটি প্রয়োগ করে।
জিম বাল্টার

উত্তর:


548

foreachযে সংগ্রহগুলি বাস্তবায়ন উপর iterating জন্য IEnumerable। এটি GetEnumeratorসংগ্রহকে কল করে এটি করে, যা একটি ফেরত দেয় Enumerator

এই গণকের একটি পদ্ধতি এবং একটি সম্পত্তি রয়েছে:

  • MoveNext ()
  • বর্তমান

Currentএনুমুরেটর বর্তমানে চালু থাকা অবজেক্টটিকে পরের বস্তুতে MoveNextআপডেট Currentকরে।

একটি সূচকের ধারণাটি গণনার ধারণার বাইরে, এবং এটি করা যায় না।

যে কারণে, বেশিরভাগ সংগ্রহগুলি ইনডেক্সার এবং লুপ কনস্ট্রাক্টের জন্য ব্যবহার করে ট্র্যাভারস করতে সক্ষম হয়।

স্থানীয় ভেরিয়েবলের সাথে সূচকটি ট্র্যাক করার তুলনায় আমি এই পরিস্থিতিতে লুপের জন্য খুব বেশি পছন্দ করি।


165
"স্পষ্টতই, একটি সূচকের ধারণাটি গণনার ধারণার বাইরে, এবং এটি করা যায় না।" - ডেভিড বি এবং বিকাহিলের উত্তরগুলি পরিষ্কার করার কারণে এটি আজেবাজে কথা। একটি সূচকটি একটি পরিসীমা জুড়ে একটি গণনা, এবং সমান্তরালভাবে কেউ দুটি জিনিস গণনা করতে পারে না এমন কোনও কারণ নেই ... এটি হ'ল এনামিউরেবলের নির্বাচক সূচক রূপটি e নির্বাচন করুন।
জিম বাল্টার

11
বেসিক কোড উদাহরণ:for(var i = 0; i < myList.Count; i ++){System.Diagnostics.Debug.WriteLine(i);}
চাদ হেডককক

22
@ জিমবাল্টার: এটি আমি প্রথম লিঙ্কটি পড়েছি। আমি দেখতে পাচ্ছি না এটি কীভাবে আপনার অবস্থান সমর্থন করে। জবাব দেওয়ার সময় আমি লোকদের কাছে অ্যাড-হোমস এবং বিভাজনমূলক শব্দও ছুঁড়ে ফেলি না। আমি উদাহরণ হিসাবে আপনার "ননসেন্স", "অসাধারণ বিভ্রান্তি", "পুরোপুরি ভুল এবং বিভ্রান্ত", "আমার 37 টি উন্নতি পেয়েছি" ইত্যাদি ইত্যাদি উদাহরণ হিসাবে উল্লেখ করেছি (আমি মনে করি যে আপনার অহং এখানে লাইনটিতে কিছুটা সামান্য।) পরিবর্তে, আমি 'বিনীতভাবে জিজ্ঞাসা করতে চাই যে আপনি আপনার' যুক্তিযুক্ত বিজ্ঞাপনের ভেরিকান্দিয়াম 'দিয়ে অন্যকে ব্রাউজ করবেন না এবং এর পরিবর্তে আমি আপনাকে স্ট্যাকওভারফ্লোতে এখানে মানুষকে সমর্থন করার উপায়গুলি সম্পর্কে ভাবতে উত্সাহিত করতে চাই। আমি বলব জন স্কিটি এখানে এক মডেল নাগরিক।
প্রিটজেল 21

11
প্রিটজেল: একজন মডেল নাগরিক হিসাবে আপনার জোন স্কিটের ব্যবহার ভুল হয়েছে, কারণ তিনি যে অভিজ্ঞ ব্যক্তির সাথে একমত নন তিনি ব্রাউট করবেন (এবং ডাউনওোট করবেন), যেমনটি আমি অভিজ্ঞ হয়েছি। জিম বাল্টার: আপনার কয়েকটি মন্তব্য অতিরিক্ত আক্রমণাত্মক ছিল এবং আপনি কম ক্রোধ এবং আরও শিক্ষার সাথে আপনার পয়েন্টগুলি উপস্থাপন করতে পারতেন।
সানক্যাট 2000

7
@ প্রিটজেল জিমের বক্তব্যটি যতক্ষণ না আপনি উপাদানগুলিকে পূর্ণসংখ্যার ক্রমিক মানচিত্র করতে পারবেন ততক্ষণ আপনি এটি সূচক করতে পারেন। যে শ্রেণি নিজেই কোনও সূচক সঞ্চয় করে না সে বিন্দুর পাশে রয়েছে। উপরন্তু, যে লিঙ্ক তালিকায় আছে একটি আদেশ আছে শুধুমাত্র জিম অবস্থান শক্তিশালী করে। আপনাকে যা করতে হবে তা হ'ল প্রতিটি উপাদান ক্রমযুক্ত number বিশেষত, আপনি পুনরাবৃত্তি করার সময় একটি সংখ্যা বাড়িয়ে আপনি এটি অর্জন করতে পারেন , বা আপনি একই দৈর্ঘ্যের সাথে পূর্ণসংখ্যার একটি তালিকা তৈরি করতে পারেন এবং তারপরে সেগুলিকে জিপ করতে পারেন (পাইথনের zipফাংশন হিসাবে)।
jpmc26

665

ফিল হ্যাকের ব্লগে ইয়ান মার্সার এ জাতীয় সমাধান পোস্ট করেছেন :

foreach (var item in Model.Select((value, i) => new { i, value }))
{
    var value = item.value;
    var index = item.i;
}

এটি আপনাকে লিংকের এই ওভারলোডটি ব্যবহার করে আইটেম ( item.value) এবং এর সূচক ( item.i) দেয় :Select

[নির্বাচনের ভিতরে] ফাংশনের দ্বিতীয় প্যারামিটার উত্স উপাদানটির সূচকটি উপস্থাপন করে।

new { i, value }একটি নতুন তৈরি করছে বেনামী বস্তুর

ValueTupleআপনি যদি সি # 7.0 বা তার পরে ব্যবহার করেন তবে গাদা বরাদ্দগুলি এড়ানো যায় :

foreach (var item in Model.Select((value, i) => ( value, i )))
{
    var value = item.value;
    var index = item.i;
}

আপনি item.স্বয়ংক্রিয় ধ্বংসাত্মক ব্যবহার করে এটিকেও দূর করতে পারেন :

<ol>
foreach ((MyType value, Int32 i) in Model.Select((value, i) => ( value, i )))
{
    <li id="item_@i">@value</li>
}
</ol>

9
এই সমাধানটি একটি রেজার টেম্পলেটটির ক্ষেত্রে দুর্দান্ত যেখানে টেম্পলটির ঝরঝরেতা একটি তুচ্ছ ডিজাইনের উদ্বেগ এবং আপনি অঙ্কিত প্রতিটি আইটেমের সূচিও ব্যবহার করতে চাইছেন। তবে মনে রাখবেন যে 'মোড়ক' থেকে অবজেক্টের বরাদ্দ কোনও পূর্ণসংখ্যার (অপরিবর্তনীয়) বৃদ্ধিকরণের উপরে ব্যয় (স্থান এবং সময়ে) যোগ করে।
ডেভিড বুলক

6
@mjsr ডকুমেন্টেশন এখানে
থোরকিল হলম-জ্যাকবসেন

19
দুঃখিত - এটি চতুর, তবে ভবিষ্যতের বাইরে কোনও সূচক তৈরি করা এবং প্রতিটি লুপকে বাড়িয়ে তোলার চেয়ে কি সত্যই বেশি পঠনযোগ্য?
jbyrd

13
পরবর্তী সি # সংস্করণগুলির সাহায্যে আপনি টিউপসগুলিও ব্যবহার করেন, সুতরাং আপনার কাছে এর মতো কিছু থাকবে: মডেল-এ সিলেক্ট ((v, i) => (v, i)) এর পূর্বে (var (আইটেম, i)) আপনাকে অনুমতি দেয় আইটেম এবং সূচক অ্যাক্সেস (i) টিপল ডিকনস্ট্রাকশন সহ সরাসরি লুপের ভিতরে।
Haukman

5
কেউ আমাকে ব্যাখ্যা করতে পারেন কেন এটি একটি ভাল উত্তর (লেখার সময় 450 এরও বেশি উর্ধ্বে)? যতদূর আমি দেখতে পাচ্ছি যে এটি কেবল কাউন্টার বাড়ানোর চেয়ে বোঝা আরও কঠিন, সুতরাং এটি কম রক্ষণাবেক্ষণযোগ্য, এটি বেশি স্মৃতি ব্যবহার করে এবং সম্ভবত এটি ধীর হয়। আমি কিছু অনুপস্থিত করছি?
ধনী এন

182

অবশেষে সি # 7 এর একটি foreachলুপের ভিতরে সূচক পাওয়ার জন্য একটি শালীন বাক্য গঠন রয়েছে (অর্থাত্: টিপলস):

foreach (var (item, index) in collection.WithIndex())
{
    Debug.WriteLine($"{index}: {item}");
}

একটু এক্সটেনশন পদ্ধতির প্রয়োজন হবে:

public static IEnumerable<(T item, int index)> WithIndex<T>(this IEnumerable<T> self)       
   => self.Select((item, index) => (item, index)); 

8
এই উত্তরটি আন্ডাররেটেড করা হয়েছে, টিপলস থাকা অনেক পরিষ্কার
টড

7
নাল সংগ্রহগুলি পরিচালনা করতে পরিবর্তিত:public static IEnumerable<(T item, int index)> WithIndex<T>(this IEnumerable<T> self) => self?.Select((item, index) => (item, index)) ?? new List<(T, int)>();
2

সুন্দর. আমি এই সমাধানটি সত্যিই সবচেয়ে পছন্দ করি।
ফ্রানজহুবার 23

এটি সেরা উত্তর
w0ns88

2
অন্যান্য ভাষায়Enumerated ব্যবহৃত লোকদের (এবং সম্ভবত টিউপল প্যারামিটারগুলির ক্রমটিও অদলবদল করা যেতে পারে) এর জন্য পদ্ধতিটিকে আরও স্বীকৃত হিসাবে চিহ্নিত করা কার্যকর হতে পারে । এটি কোনওভাবেই সুস্পষ্ট নয়। WithIndex
ফার্নআন্ডার

114

এরকম কিছু করতে পারে:

public static class ForEachExtensions
{
    public static void ForEachWithIndex<T>(this IEnumerable<T> enumerable, Action<T, int> handler)
    {
        int idx = 0;
        foreach (T item in enumerable)
            handler(item, idx++);
    }
}

public class Example
{
    public static void Main()
    {
        string[] values = new[] { "foo", "bar", "baz" };

        values.ForEachWithIndex((item, idx) => Console.WriteLine("{0}: {1}", idx, item));
    }
}

12
এটি "সত্যই" সমস্যার সমাধান করে না। ধারণাটি ভাল তবে এটি অতিরিক্ত গণনা ভেরিয়েবল এড়াতে পারে না
Atmocreations

লুপের জন্য আমাদের মধ্যে যদি রিটার্নের স্টেটমেন্ট থাকে তবে এটি কাজ করে না, যদি আপনি তার জন্য "ফরইচবিথইন্ডেক্স" পরিবর্তন করেন তবে লুপের জন্য নিয়মিত লেখার চেয়ে জেনেরিক নয়, ভাল
শঙ্কর রাজু

আপনার ফরইচবিথআইডেক্স কলটি লিংক সিলেক্ট ব্যবহার করে এইটির সমান যা স্ট্রিং এবং সূচি গ্রহণ করে:values.Select((item, idx) => { Console.WriteLine("{0}: {1}", idx, item); return item; }).ToList();
ব্যবহারকারী 2023861

95

forবেশিরভাগ ক্ষেত্রে একটি লুপ একটি ভাল পছন্দ যে মন্তব্যগুলির সাথে আমি একমত নই ।

foreachএকটি দরকারী নির্মাণ, এবং forসমস্ত পরিস্থিতিতে একটি লুপ দ্বারা প্রতিস্থাপনযোগ্য নয় ।

উদাহরণস্বরূপ, যদি আপনি একটি আছে DataReader ব্যবহার সব রেকর্ড দিয়ে লুপ একটি foreachএটি স্বয়ংক্রিয়ভাবে কল নিষ্পত্তি পদ্ধতি এবং পাঠক বন্ধ (যা যা করতে পারেন তারপর নিবিড় সম্পর্ক স্বয়ংক্রিয়ভাবে)। এটি তাই নিরাপদ কারণ এটি পাঠককে বন্ধ করতে ভুলে গেলেও সংযোগ ফাঁস রোধ করে।

(অবশ্যই পাঠককে ঘনিষ্ঠ রাখাই ভাল অনুশীলন তবে সংকলক এটি না ধরলে চলবে না - আপনি নিশ্চয়তা দিতে পারবেন না যে আপনি সমস্ত পাঠককে বন্ধ করেছেন তবে আপনি সম্ভবত এটি সংযোগ ফাঁস করবেন না এমন সম্ভাবনা তৈরি করতে পারেন) ফোরচ ব্যবহার করার অভ্যাসে।)

Disposeপদ্ধতিটি কার্যকর হওয়ার অন্তর্নিহিত কল সম্পর্কিত অন্যান্য উদাহরণ থাকতে পারে ।


2
এই বিষয়টি চিহ্নিত করার জন্য ধন্যবাদ. বরং সূক্ষ্ম। আপনি এতে আরও তথ্য পেতে পারেন pvle.be/2010/05/foreach-statement-calls-dispose-on-ienumerator এবং msdn.microsoft.com/en-us/library/aa664754(VS.71).aspx
মার্ক মেউয়ার

+1 টি। আমি প্রোগ্রামার্স.এসইতে কীভাবে foreachআলাদা for(এবং আরও কাছাকাছি while) তার সম্পর্কে আরও বিস্তারিত লিখছিলাম ।
আর্সেনি মরজেনকো

64

আক্ষরিক উত্তর - সতর্কতা, পারফরম্যান্স intসূচকটি ট্র্যাক করতে কেবল একটি ব্যবহার করার মতো ভাল নাও হতে পারে । কমপক্ষে এটি ব্যবহার করার চেয়ে ভাল IndexOf

সংগ্রহের প্রতিটি আইটেমকে সূচকটি জানে এমন কোনও বেনামি বস্তু দিয়ে মোড়ানোর জন্য আপনাকে কেবল নির্বাচনের ইনডেক্সিং ওভারলোড ব্যবহার করতে হবে। এটি IEnumerable প্রয়োগ করে এমন কোনও কিছুর বিরুদ্ধে করা যেতে পারে।

System.Collections.IEnumerable collection = Enumerable.Range(100, 10);

foreach (var o in collection.OfType<object>().Select((x, i) => new {x, i}))
{
    Console.WriteLine("{0} {1}", o.i, o.x);
}

3
Castালাই <T> () এর পরিবর্তে অফটাইপ <T> () ব্যবহারের একমাত্র কারণ হ'ল যদি গণনার কিছু আইটেম একটি সুস্পষ্ট কাস্ট ব্যর্থ হতে পারে। বস্তুর পক্ষে, এটি কখনই হবে না।
dahlbyk

13
অবশ্যই, কাস্টের পরিবর্তে অফটাইপ ব্যবহারের অন্যান্য কারণ ব্যতীত - যা আমি কখনই কাস্ট ব্যবহার করি না।
অ্যামি বি

36

লিনকিউ, সি # 7 এবং System.ValueTupleনিউগেট প্যাকেজ ব্যবহার করে আপনি এটি করতে পারেন:

foreach (var (value, index) in collection.Select((v, i)=>(v, i))) {
    Console.WriteLine(value + " is at index " + index);
}

আপনি নিয়মিত foreachকনস্ট্রাক্ট ব্যবহার করতে পারেন এবং মান এবং সূচকটি সরাসরি অ্যাক্সেস করতে সক্ষম হবেন, কোনও বস্তুর সদস্য হিসাবে নয় এবং উভয় ক্ষেত্রকে কেবল লুপের আওতায় রাখেন। এই কারণে, আমি বিশ্বাস করি যে আপনি যদি সি # 7 এবং ব্যবহার করতে সক্ষম হন তবে এটিই সেরা সমাধান System.ValueTuple



@ অ্যাডওয়ার্ড্রে আমি মনে করি এটি তা নয়। এই প্রশ্নের অনেক উত্তর রয়েছে, আমি সম্ভবত এটি মিস করেছি বা এটি কী করছে তা লক্ষ্য করিনি কারণ তিনি কিছু যুক্তি যুক্ত করে একটি এক্সটেনশন পদ্ধতিতে আলাদা করেছিলেন।
পাভেল

1
এটি আলাদা কারণ কারণ নির্বাচনগুলি LINQ থেকে অন্তর্নির্মিত। আপনার নিজের ফাংশনটি লিখতে হবে না? যদিও আপনার কাছে "সিস্টেম.ভালিউটুপল" ভিএস ইনস্টল করা দরকার।
অ্যান্টন

33

@ ফ্লাইওয়াত এর উত্তর ব্যবহার করে, আমি এই সমাধানটি নিয়ে এসেছি:

//var list = new List<int> { 1, 2, 3, 4, 5, 6 }; // Your sample collection

var listEnumerator = list.GetEnumerator(); // Get enumerator

for (var i = 0; listEnumerator.MoveNext() == true; i++)
{
  int currentItem = listEnumerator.Current; // Get current item.
  //Console.WriteLine("At index {0}, item is {1}", i, currentItem); // Do as you wish with i and  currentItem
}

আপনি এনুমरेटरটি ব্যবহার করে পাবেন GetEnumeratorএবং তারপরে আপনি একটি forলুপ ব্যবহার করে লুপ করবেন। তবে কৌশলটি লুপের অবস্থা তৈরি করা listEnumerator.MoveNext() == true

যেহেতু MoveNextকোনও পরবর্তী উপাদান উপস্থিত থাকলে একটি এনুমিরেটরের পদ্ধতিটি সত্য হয় এবং এটি অ্যাক্সেস করা যায়, যখন লুপের অবস্থা লুপটি থামিয়ে দেয় যখন আমরা উপাদানগুলি শেষ করে বেরিয়ে আসি।


10
তালিকার সাথে তুলনা করার দরকার নেই.নামিউরেটর.মোভেক্সট () == সত্য। এটি কম্পিউটারকে জিজ্ঞাসা করার মতো যদি সত্য == সত্য? :) কেবলমাত্র লিস্টইনমেন্টের কথা বলুন। মোভনেক্সট () {}
দয়া করে এখানে ক্লিক করুন

9
@ জেস্ট, আপনি একেবারে সঠিক আমি অনুভব করেছি যে এটি এ ক্ষেত্রে যুক্ত করা আরও পঠনযোগ্য, বিশেষত এমন লোকদের জন্য যারা শর্ত হিসাবে আই <blahSize ব্যতীত অন্য কোনও কিছুতে প্রবেশ করতে অভ্যস্ত নয়।
গিজিম

@ গিজিম আমি এখানে ভবিষ্যদ্বাণী করা মনে করি না, তবে আমি আপনার বক্তব্যটি পেয়েছি যে এটি কোনও প্রাকটিকের মতো দেখাচ্ছে না।
জন ডিভোরাক

1
আপনার অবশ্যই গণনা নিষ্পত্তি করা উচিত।
আন্তোনোন লেজসেক

@ অ্যান্টোনলিজেসেক গণক কার্যকর করে না IDisposable
এডওয়ার্ড ব্রে

27

কাউন্টার ভেরিয়েবল ব্যবহার করে কোনও ভুল নেই। আসলে, আপনি ব্যবহার করেন না for, foreach whileবা do, একটি পাল্টা ভেরিয়েবল অবশ্যই কোথাও ঘোষিত এবং বর্ধিত হতে হবে।

সুতরাং আপনার যদি উপযুক্ত-সূচকযুক্ত সংগ্রহ আছে কিনা তা নিশ্চিত না হন তবে এই প্রতিমাটি ব্যবহার করুন:

var i = 0;
foreach (var e in collection) {
   // Do stuff with 'e' and 'i'
   i++;
}

অন্যথায় এটি ব্যবহার করুন যদি আপনি জানেন যে সূচক অ্যাক্সেসের জন্য আপনার সূচকযোগ্য সংগ্রহটি ও (1) (যা এটির জন্য Arrayএবং সম্ভবত List<T>(ডকুমেন্টেশনটি বলে না)) তবে অন্য ধরণের (যেমন LinkedList) প্রয়োজন হয় না:

// Hope the JIT compiler optimises read of the 'Count' property!
for (var i = 0; i < collection.Count; i++) {
   var e = collection[i];
   // Do stuff with 'e' and 'i'
}

'ম্যানুয়ালি' চালানো এবং জিজ্ঞাসাবাদ করার IEnumeratorমাধ্যমে কখনও এটি পরিচালনা করা উচিত নয় - আপনাকে সেই বিশেষ উদ্বেগ রক্ষা করছে ... আপনার যদি আইটেমগুলি এড়ানো প্রয়োজন হয় তবে কেবল লুপটির শরীরে একটি ব্যবহার করুন ।MoveNext()Currentforeachcontinue

এবং কেবল সম্পূর্ণতার জন্য, আপনি আপনার সূচকের সাথে কী করছেন তার উপর নির্ভর করে (উপরের কনস্ট্রাক্টগুলি প্রচুর নমনীয়তা দেয়) আপনি সমান্তরাল লিনকিউ ব্যবহার করতে পারেন:

// First, filter 'e' based on 'i',
// then apply an action to remaining 'e'
collection
    .AsParallel()
    .Where((e,i) => /* filter with e,i */)
    .ForAll(e => { /* use e, but don't modify it */ });

// Using 'e' and 'i', produce a new collection,
// where each element incorporates 'i'
collection
    .AsParallel()
    .Select((e, i) => new MyWrapper(e, i));

আমরা AsParallel()উপরে ব্যবহার করেছি , কারণ এটি ইতিমধ্যে 2014, এবং আমরা জিনিসগুলি গতি বাড়ানোর জন্য এই একাধিক কোরগুলির ভাল ব্যবহার করতে চাই। আরও 'সিক্যুয়াল' লাইনকিউয়ের জন্য আপনি কেবলমাত্র একটি ForEach()এক্সটেনশন পদ্ধতি চালু রাখবেন List<T>এবংArray ... এবং এটি এখনও স্পষ্ট নয় যে এটি ব্যবহার করা কোনও সরল কাজ করার চেয়ে আরও ভাল কিছু foreach, যেহেতু আপনি এখনও কুরুচিপূর্ণ সিনট্যাক্সের জন্য একক থ্রেডেড চালাচ্ছেন।


26

আপনি মূল সূচককে অন্য একটিতে মোড়াতে পারেন যা সূচকের তথ্য ধারণ করে।

foreach (var item in ForEachHelper.WithIndex(collection))
{
    Console.Write("Index=" + item.Index);
    Console.Write(";Value= " + item.Value);
    Console.Write(";IsLast=" + item.IsLast);
    Console.WriteLine();
}

এখানে ForEachHelperক্লাসের জন্য কোড দেওয়া আছে ।

public static class ForEachHelper
{
    public sealed class Item<T>
    {
        public int Index { get; set; }
        public T Value { get; set; }
        public bool IsLast { get; set; }
    }

    public static IEnumerable<Item<T>> WithIndex<T>(IEnumerable<T> enumerable)
    {
        Item<T> item = null;
        foreach (T value in enumerable)
        {
            Item<T> next = new Item<T>();
            next.Index = 0;
            next.Value = value;
            next.IsLast = false;
            if (item != null)
            {
                next.Index = item.Index + 1;
                yield return item;
            }
            item = next;
        }
        if (item != null)
        {
            item.IsLast = true;
            yield return item;
        }            
    }
}

এটি আসলে আইটেমের সূচি ফেরত দেবে না। পরিবর্তে, এটি তালিকাভুক্ত তালিকার ভিতরে সূচকটি ফিরিয়ে দেবে, যা কেবলমাত্র তালিকার একটি উপ তালিকা হতে পারে, কেবলমাত্র সাবস্টিস্ট এবং তালিকা সমান আকারের হলে আপনাকে সঠিক তথ্য দেয়। মূলত, যে কোনও সময় সংগ্রহের মধ্যে অনুরোধ করা টাইপের মধ্যে এটির মধ্যে অবজেক্ট রয়েছে তবে আপনার সূচকটি ভুল হবে।
লুকাস বি

7
@ লুকাস: না, তবে এটি বর্তমান পূর্ববর্তী পুনরাবৃত্তির সূচকটি ফিরিয়ে দেবে। এটাই ছিল প্রশ্ন।
ব্রায়ান গিডন

20

এই সমস্যাটির জন্য আমি এখানে একটি সমাধান নিয়ে এসেছি

আসল কোড:

int index=0;
foreach (var item in enumerable)
{
    blah(item, index); // some code that depends on the index
    index++;
}

আপডেট হওয়া কোড

enumerable.ForEach((item, index) => blah(item, index));

সম্প্রসারণ পদ্ধতি:

    public static IEnumerable<T> ForEach<T>(this IEnumerable<T> enumerable, Action<T, int> action)
    {
        var unit = new Unit(); // unit is a new type from the reactive framework (http://msdn.microsoft.com/en-us/devlabs/ee794896.aspx) to represent a void, since in C# you can't return a void
        enumerable.Select((item, i) => 
            {
                action(item, i);
                return unit;
            }).ToList();

        return pSource;
    }

16

শুধু আপনার নিজস্ব সূচি যোগ করুন। সহজবোধ্য রাখো.

int i = 0;
foreach (var item in Collection)
{
    item.index = i;
    ++i;
}

15

এটি কেবল কোনও তালিকার জন্য কাজ করছে এবং কোনও অনুমানযোগ্য নয়, তবে লিনকুইতে এটি রয়েছে:

IList<Object> collection = new List<Object> { 
    new Object(), 
    new Object(), 
    new Object(), 
    };

foreach (Object o in collection)
{
    Console.WriteLine(collection.IndexOf(o));
}

Console.ReadLine();

@ জোনাথন আমি এটি বলি নি যে এটি একটি দুর্দান্ত উত্তর, আমি কেবল বলেছি এটি কেবল এটিই দেখিয়েছে যে তিনি যা চান তা করা সম্ভব ছিল :)

@ গ্রাফাইন আমি এটি দ্রুত হওয়ার প্রত্যাশা করবো না - এটি কীভাবে কাজ করে তা সম্পর্কে আমি পুরোপুরি নিশ্চিত নই, প্রতিবারই এটি কোনও তাল মিলিয়ে কোনও মিলিয়ে যাওয়া বস্তু সন্ধানের জন্য পুরো তালিকার মাধ্যমে পুনরাবৃত্তি করতে পারে, যা তুলনার একটি নরক মূল্যায়ন হবে।

এটি বলেছিল, তালিকাগুলির সাথে প্রতিটি বস্তুর একটি সূচক রাখতে পারে।

জোনাথন আরও ভাল ধারণা আছে বলে মনে হয়, যদি সে বিস্তারিত জানায়?

আপনি ভবিষ্যদ্বাণীতে কোথায় রয়েছেন তা সহজ, সহজ এবং আরও অভিযোজ্য just


5
ভারী নেমে যাওয়ার বিষয়ে নিশ্চিত নয়। অবশ্যই পারফরম্যান্স এটি নিষিদ্ধ করে তোলে তবে আপনি প্রশ্নের উত্তর দিয়েছিলেন!
ম্যাট মিচেল 21

4
এর সাথে আর একটি সমস্যা হ'ল তালিকার আইটেমগুলি স্বতন্ত্র হলে কেবল এটি কাজ করে।
কোডসইনচাউস

14

সি # 7 শেষ পর্যন্ত আমাদের এটি করার জন্য একটি মার্জিত উপায় দেয়:

static class Extensions
{
    public static IEnumerable<(int, T)> Enumerate<T>(
        this IEnumerable<T> input,
        int start = 0
    )
    {
        int i = start;
        foreach (var t in input)
        {
            yield return (i++, t);
        }
    }
}

class Program
{
    static void Main(string[] args)
    {
        var s = new string[]
        {
            "Alpha",
            "Bravo",
            "Charlie",
            "Delta"
        };

        foreach (var (i, t) in s.Enumerate())
        {
            Console.WriteLine($"{i}: {t}");
        }
    }
}

হ্যাঁ, এবং এমএসের এই জাতীয় জিনিসটি স্থানীয় করার জন্য সিএলআর / বিসিএল বাড়ানো উচিত।
টড

14

কেন ভবিষ্যদ্বাণী ?!

আপনি তালিকাটি ব্যবহার করছেন তবে সরলতম উপায় ফোরচের পরিবর্তে ব্যবহার করা হচ্ছে :

for (int i = 0 ; i < myList.Count ; i++)
{
    // Do something...
}

অথবা আপনি যদি ভবিষ্যদ্বাণী ব্যবহার করতে চান:

foreach (string m in myList)
{
     // Do something...
}

প্রতিটি লুপের সূচি জানতে আপনি এটি ব্যবহার করতে পারেন:

myList.indexOf(m)

8
সূচিপত্র সহ তালিকার জন্য সূচিপত্র অবৈধ এবং এটি খুব ধীর।
tymtam

2
এড়ানো এড়াতে সমস্যাটি হ'ল আপনি যেখানে একাধিকবার আইনিউবারেবলকে অতিক্রম করেন, যেমন আইটেমগুলির গণনা এবং তারপরে প্রতিটি আইটেম। উদাহরণস্বরূপ যখন ডাটাবেস ক্যোয়ারীর ফলাফল যখন আইনিম্যারেবল হয় তখন এর অন্তর্ভুক্ত থাকে।
ডেভিড ক্লার্ক

2
myList.IndexOf () হ'ল (n), সুতরাং আপনার লুপটি O (n ^ 2) হবে।
প্যাট্রিক দাড়ি 18

9
int index;
foreach (Object o in collection)
{
    index = collection.indexOf(o);
}

এটি সমর্থন সংগ্রহের জন্য কাজ করবে IList


68
দুটি সমস্যা: 1) এটি O(n^2)যেহেতু বেশিরভাগ বাস্তবায়নের IndexOfমধ্যে রয়েছে O(n)। 2) তালিকায় সদৃশ আইটেম থাকলে এটি ব্যর্থ হয়।
কোডসইনচাউস

15
দ্রষ্টব্য: ও (এন ^ 2) এর অর্থ এটি বড় সংগ্রহের জন্য ধ্বংসাত্মকভাবে ধীর হতে পারে।
ও'রুনি

সূচিপত্র পদ্ধতি ব্যবহারের দুর্দান্ত আবিষ্কার! ফরচ লুপে সূচক (নম্বর) পাওয়ার জন্য আমি এটিই খুঁজছিলাম! বিগ
থেক্স

19
Godশ্বর, আমি আশা করি আপনি এটি ব্যবহার করেন নি! :( এটি আপনি যে পরিবর্তনশীল তৈরি করতে চাননি তা ব্যবহার করে - বাস্তবে এটি এন + 1 ইনট তৈরি করবে কারণ সেই ফাংশনটি ফিরে আসার জন্য একটি তৈরি করতে হবে - এবং যে সূচী অনুসন্ধানটি অনেক বেশি, তার চেয়ে অনেক ধীর গতিতে রয়েছে) প্রতিটি পদক্ষেপে একটি পূর্ণসংখ্যা বৃদ্ধি অপারেশন। লোকেরা কেন এই উত্তরটি ভোট দেবে না?
কানাহারী

13
এই উত্তরটি ব্যবহার করবেন না, আমি একটি মন্তব্যে উল্লিখিত কঠোর সত্যটি পেয়েছি। "তালিকায় নকল আইটেম থাকলে এটি ব্যর্থ হয়।" !!!
ব্রুস

9

আমি এটি এইভাবেই করি, যা এর সরলতা / সংকোচনের জন্য দুর্দান্ত, তবে আপনি যদি লুপের শরীরে অনেক কিছু করছেন তবে obj.Valueএটি পুরানো বেশ দ্রুতগতিতে চলেছে।

foreach(var obj in collection.Select((item, index) => new { Index = index, Value = item }) {
    string foo = string.Format("Something[{0}] = {1}", obj.Index, obj.Value);
    ...
}

8

এই উত্তর: সরাসরি ভাষা সহায়তার জন্য সি # ভাষা দল লবি করুন।

শীর্ষস্থানীয় উত্তর বলে:

স্পষ্টতই, একটি সূচকের ধারণাটি গণনার ধারণার বাইরে, এবং এটি করা যায় না।

যদিও এটি বর্তমান সি # ভাষার সংস্করণ (2020) এর ক্ষেত্রে সত্য, এটি কোনও ধারণাগত সিএলআর / ভাষার সীমা নয়, এটি করা যেতে পারে।

মাইক্রোসফ্ট সি # ভাষা বিকাশকারী টিম একটি নতুন ইন্টারফেস IIndexedEeumerable জন্য সমর্থন যোগ করে একটি নতুন সি # ভাষা বৈশিষ্ট্য তৈরি করতে পারে

foreach (var item in collection with var index)
{
    Console.WriteLine("Iteration {0} has value {1}", index, item);
}

//or, building on @user1414213562's answer
foreach (var (item, index) in collection)
{
    Console.WriteLine("Iteration {0} has value {1}", index, item);
}

যদি foreach ()ব্যবহৃত হয় এবং with var indexউপস্থিত হয়, তবে সংকলকটি আইটেম সংগ্রহটি IIndexedEnumerableইন্টারফেস ঘোষণা করার প্রত্যাশা করে । যদি ইন্টারফেসটি অনুপস্থিত থাকে তবে সংকলক সূচকটিকে ইনডেক্সডইনিউমারেবল অবজেক্টের সাথে মোড়াতে পারে, যা সূচকে অনুসরণ করার কোডটিতে যুক্ত করে।

interface IIndexedEnumerable<T> : IEnumerable<T>
{
    //Not index, because sometimes source IEnumerables are transient
    public long IterationNumber { get; }
}

পরে, সিএলআরটি অভ্যন্তরীণ সূচক ট্র্যাকিংয়ের জন্য আপডেট করা যেতে পারে, এটি কেবল তখনই ব্যবহৃত হয় যখন withকীওয়ার্ড নির্দিষ্ট করা থাকে এবং উত্সটি সরাসরি প্রয়োগ করে নাIIndexedEnumerable

কেন:

  • ফোরচ আরও সুন্দর দেখায়, এবং ব্যবসায়িক অ্যাপ্লিকেশনগুলিতে, ফোরচ লুপগুলি খুব কমই একটি পারফরম্যান্স বাধা হয়
  • ফরচ স্মৃতিতে আরও দক্ষ হতে পারে। প্রতিটি পদক্ষেপে নতুন সংগ্রহগুলিতে রূপান্তর না করে ফাংশনগুলির পাইপলাইন থাকা। কম সিপিইউ ক্যাশে ত্রুটি এবং কম আবর্জনা সংগ্রহের সময় এটি আরও কয়েকটি সিপিইউ চক্র ব্যবহার করে তবে কে কে পাত্তা দেয়?
  • ইনডেক্স-ট্র্যাকিং কোড যুক্ত করতে কোডারটির প্রয়োজনীয়তা, সৌন্দর্যকে নষ্ট করে
  • এটি প্রয়োগ করা বেশ সহজ (দয়া করে মাইক্রোসফ্ট) এবং পিছনে সামঞ্জস্যপূর্ণ

যদিও অধিকাংশ লোক এখানে মাইক্রোসফট কর্মচারী নন, এই একটি সঠিক উত্তর, আপনি এই ধরনের একটি বৈশিষ্ট্য যোগ করার জন্য মাইক্রোসফট লবি পারবেন না। আপনি ইতিমধ্যে একটি এক্সটেনশন ফাংশন দিয়ে নিজের ইউটরেটর তৈরি করতে এবং টিপলস ব্যবহার করতে পারেন , তবে মাইক্রোসফ্ট এক্সটেনশন ফাংশনটি এড়াতে সিনট্যাকটিক চিনি ছিটিয়ে দিতে পারে


অপেক্ষা করুন, সুতরাং এই ভাষা বৈশিষ্ট্যটি ইতিমধ্যে বিদ্যমান আছে, না এটি ভবিষ্যতের জন্য প্রস্তাবিত?
পাভেল

1
@ পাভেল আমি উত্তরটি পরিষ্কার করার জন্য আপডেট করেছি। এই উত্তরটি অগ্রণী জবাবের মোকাবেলায় সরবরাহ করা হয়েছিল যা বলে যে "অবশ্যই, একটি সূচকের ধারণাটি গণনার ধারণার চেয়ে বিদেশী, এবং এটি করা যায় না।"
টড

6

যদি সংগ্রহটি একটি তালিকা হয় তবে আপনি তালিকা হিসাবে ব্যবহার করতে পারেন। সূচিপত্রগুলি, যেমন:

foreach (Object o in collection)
{
    // ...
    @collection.IndexOf(o)
}

13
এবং এখন অ্যালগরিদম হ'ল ও (এন ^ 2) (আরও খারাপ না হলে)। আমি এটি ব্যবহার করার আগে খুব সাবধানে চিন্তা করব । এটিও ক্রুশিবল উত্তরের একটি সদৃশ
ব্র্যাডলিডটনেট

1
@ ব্র্যাডলিডটনেট ঠিক ঠিক, এই সংস্করণটি ব্যবহার করবেন না।
ওসকার

1
এই সাবধান! আপনি যদি আপনার তালিকায় একটি সদৃশ আইটেম পেয়ে থাকেন তবে এটি প্রথমটির অবস্থানটি পাবে!
সোনহজা

5

এর continueমতো কী- ওয়ার্ড নিরাপদ নির্মাণ ব্যবহার করা আরও ভাল

int i=-1;
foreach (Object o in collection)
{
    ++i;
    //...
    continue; //<--- safe to call, index will be increased
    //...
}

5

আপনি আপনার লুপটি এভাবে লিখতে পারেন:

var s = "ABCDEFG";
foreach (var item in s.GetEnumeratorWithIndex())
{
    System.Console.WriteLine("Character: {0}, Position: {1}", item.Value, item.Index);
}

নিম্নলিখিত স্ট্রাক্ট এবং এক্সটেনশন পদ্ধতি যুক্ত করার পরে।

স্ট্রাক্ট এবং এক্সটেনশন পদ্ধতিটি এনামিউরেবলকে বেছে নেয় function নির্বাচন করুন কার্যকারিতা।

public struct ValueWithIndex<T>
{
    public readonly T Value;
    public readonly int Index;

    public ValueWithIndex(T value, int index)
    {
        this.Value = value;
        this.Index = index;
    }

    public static ValueWithIndex<T> Create(T value, int index)
    {
        return new ValueWithIndex<T>(value, index);
    }
}

public static class ExtensionMethods
{
    public static IEnumerable<ValueWithIndex<T>> GetEnumeratorWithIndex<T>(this IEnumerable<T> enumerable)
    {
        return enumerable.Select(ValueWithIndex<T>.Create);
    }
}

3

এই সমস্যার জন্য আমার সমাধানটি একটি এক্সটেনশন পদ্ধতি WithIndex(),

http://code.google.com/p/ub-dotnet-utilities/source/browse/trunk/Src/Utilities/Extensions/EnumerableExtensions.cs

এটি ব্যবহার করুন

var list = new List<int> { 1, 2, 3, 4, 5, 6 };    

var odd = list.WithIndex().Where(i => (i.Item & 1) == 1);
CollectionAssert.AreEqual(new[] { 0, 2, 4 }, odd.Select(i => i.Index));
CollectionAssert.AreEqual(new[] { 1, 3, 5 }, odd.Select(i => i.Item));

আমি struct(সূচক, আইটেম) জুটির জন্য একটি ব্যবহার করব ।
কোডসইনচাউস

3

আগ্রহের জন্য, ফিল হ্যাক কেবল একটি রেজার টেম্পলেটড ডেলিগেটের প্রসঙ্গে এই উদাহরণটি লিখেছেন ( http://haacked.com/archive/2011/04/14/a-better-razor-foreach-loop.aspx )

কার্যকরভাবে তিনি একটি এক্সটেনশন পদ্ধতি লিখেছেন যা "আইট্রেটেড আইটেম" শ্রেণিতে পুনরাবৃত্তিকে আবৃত করে (নীচে দেখুন) সূচিটি পাশাপাশি পুনরাবৃত্তির সময় উপাদানগুলিতে অ্যাক্সেসের অনুমতি দেয় allowing

public class IndexedItem<TModel> {
  public IndexedItem(int index, TModel item) {
    Index = index;
    Item = item;
  }

  public int Index { get; private set; }
  public TModel Item { get; private set; }
}

তবে এটি অ-রেজার পরিবেশে ভাল হবে যদি আপনি একটি একক অপারেশন করছেন (যেমন ল্যাম্বডা হিসাবে সরবরাহ করা যেতে পারে) তবে এটি রেজার ছাড়াই প্রেক্ষাপটে ফর ফরচ সিনট্যাক্সের একটি দৃ replacement় প্রতিস্থাপন হতে চলেছে না ।



3

আমি লিনকুইপ্যাডে এটি তৈরি করেছি :

var listOfNames = new List<string>(){"John","Steve","Anna","Chris"};

var listCount = listOfNames.Count;

var NamesWithCommas = string.Empty;

foreach (var element in listOfNames)
{
    NamesWithCommas += element;
    if(listOfNames.IndexOf(element) != listCount -1)
    {
        NamesWithCommas += ", ";
    }
}

NamesWithCommas.Dump();  //LINQPad method to write to console.

আপনি কেবল ব্যবহার করতে পারেন string.join:

var joinResult = string.Join(",", listOfNames);

আপনি সি # তেও স্ট্রিং.জইন ব্যবহার করতে পারেন উদাহরণস্বরূপ: var joinResult = স্ট্রিং।জাইন (",", listOfNames); '
ওয়ারেন লাফ্রান্স

1
কেউ আমাকে বোঝাতে পারেন যে এই ও (এন * এন) জিনিসটি কী?
এক্সেল

@ অ্যাক্সেল এটির মূলত এর অর্থ হ'ল ফলাফল গণনা করার জন্য প্রয়োজনীয় অপারেশনগুলি চতুর্ভুজ বৃদ্ধি পায়, অর্থাত্ যদি nআইটেমগুলি থাকে তবে অপারেশনগুলি হয় n * n, বা- nসুরক্ষিত। en.wikedia.org/wiki/…
রিচার্ড হানসেল 11'18

2

ফোরচ লুপের বর্তমান পুনরাবৃত্তির মান পাওয়ার কোনও উপায় আছে বলে আমি বিশ্বাস করি না। নিজেকে গণনা করা সবচেয়ে ভাল উপায় বলে মনে হচ্ছে।

আমি জিজ্ঞাসা করতে পারি, আপনি জানতে চান কেন?

দেখে মনে হচ্ছে আপনি বেশিরভাগ লাইকলি তিনটি জিনিসের একটি করছেন:

1) সংগ্রহ থেকে অবজেক্টটি পাওয়া, তবে এই ক্ষেত্রে আপনার ইতিমধ্যে এটি রয়েছে।

2) পরবর্তী পোস্ট প্রসেসিংয়ের জন্য অবজেক্টগুলি গণনা করা হচ্ছে ... সংগ্রহগুলির একটি গণনা সম্পত্তি রয়েছে যা আপনি ব্যবহার করতে পারেন।

3) লুপটিতে তার ক্রমের ভিত্তিতে অবজেক্টের উপর একটি সম্পত্তি সেট করা ... যদিও আপনি সহজেই সেটিংস করতে পারবেন যখন আপনি সংগ্রহটিতে অবজেক্টটি যুক্ত করবেন।


৪) আমি বেশ কয়েকবার যে মামলাটি করেছি তা হ'ল কিছু আলাদা যা প্রথম বা শেষ পাসে করতে হবে - আপনি যে জিনিসগুলি মুদ্রণ করতে যাচ্ছেন তার একটি তালিকা বলুন এবং শেষ আইটেমের পরে নয় তবে আইটেমগুলির মধ্যে আপনার কমা প্রয়োজন।
লরেন পেচটেল

2

যদি না আপনার সংগ্রহটি কোনও পদ্ধতির মাধ্যমে অবজেক্টের সূচকটি ফেরত না দেয় তবে একমাত্র উপায় আপনার উদাহরণের মতো কাউন্টার ব্যবহার করা use

যাইহোক, সূচকগুলির সাথে কাজ করার সময়, সমস্যার একমাত্র যুক্তিসঙ্গত উত্তর হ'ল লুপের জন্য একটি ব্যবহার করা। অন্য যে কোনও কিছুই কোড জটিলতার পরিচয় দেয়, সময় এবং স্থানের জটিলতার কথা উল্লেখ না করে।


2

কিভাবে ভালো কিছু সম্পর্কে? নোট করুন যে আমার অনুমিত খালি থাকলে মাইডিলিমিটেড স্ট্রিং নাল হতে পারে।

IEnumerator enumerator = myEnumerable.GetEnumerator();
string myDelimitedString;
string current = null;

if( enumerator.MoveNext() )
    current = (string)enumerator.Current;

while( null != current)
{
    current = (string)enumerator.Current; }

    myDelimitedString += current;

    if( enumerator.MoveNext() )
        myDelimitedString += DELIMITER;
    else
        break;
}

একাধিক সমস্যা এখানে। ক) অতিরিক্ত ব্রেস। খ) স্ট্রিং কনক্যাট + = প্রতি লুপ পুনরাবৃত্তি।
enorl76

2

আমার কেবল এই সমস্যাটি ছিল, তবে আমার ক্ষেত্রে সমস্যাটি সম্পর্কে চিন্তাভাবনাটি সেরা সমাধান দিয়েছে, প্রত্যাশিত সমাধানের সাথে সম্পর্কিত নয়।

এটি বেশ সাধারণ ক্ষেত্রে হতে পারে, মূলত, আমি একটি উত্স তালিকা থেকে পড়ছি এবং গন্তব্য তালিকায় তাদের উপর ভিত্তি করে অবজেক্ট তৈরি করছি তবে যাইহোক, আমাকে উত্সের আইটেমগুলি প্রথমে বৈধ কিনা তা যাচাই করতে হবে এবং যে কোনওটির সারিটি ফিরিয়ে দিতে চাই ত্রুটি. প্রথম নজরে, আমি বর্তমান সম্পত্তিতে অবজেক্টের গণকের মধ্যে সূচকটি পেতে চাই, তবে, আমি এই উপাদানগুলি অনুলিপি করছি, আমি বর্তমান গন্তব্য থেকে স্পষ্টভাবে বর্তমান সূচকটি জানি। অবশ্যই এটি আপনার গন্তব্য অবজেক্টের উপর নির্ভর করে তবে আমার জন্য এটি একটি তালিকা ছিল এবং সম্ভবত এটি আইকোলিকেশন বাস্তবায়ন করবে।

অর্থাত

var destinationList = new List<someObject>();
foreach (var item in itemList)
{
  var stringArray = item.Split(new char[] { ';', ',' }, StringSplitOptions.RemoveEmptyEntries);

  if (stringArray.Length != 2)
  {
    //use the destinationList Count property to give us the index into the stringArray list
    throw new Exception("Item at row " + (destinationList.Count + 1) + " has a problem.");
  }
  else
  {
    destinationList.Add(new someObject() { Prop1 = stringArray[0], Prop2 = stringArray[1]});
  }
}

সর্বদা প্রযোজ্য নয়, তবে প্রায়শই উল্লেখযোগ্য পরিমাণে যথেষ্ট বলে আমি মনে করি।

যাইহোক, বিন্দুটি হ'ল কখনও কখনও আপনার যুক্তিতে ইতিমধ্যে একটি স্পষ্ট সমাধান পাওয়া যায় না ...


2

প্রশ্নের উপর ভিত্তি করে আপনি সূচী তথ্য দিয়ে কী করার চেষ্টা করছেন তা নিশ্চিত ছিলাম না। যাইহোক, সি # তে, আপনি সাধারণত আইইনামেবারেবল মানিয়ে নিতে পারেন you যা চান তা থেকে সূচকটি পেতে নির্বাচন পদ্ধতি নির্বাচন করুন। উদাহরণস্বরূপ, আমি মানটি বিজোড় বা এমনকি এর জন্য এই জাতীয় কিছু ব্যবহার করতে পারি।

string[] names = { "one", "two", "three" };
var oddOrEvenByName = names
    .Select((name, index) => new KeyValuePair<string, int>(name, index % 2))
    .ToDictionary(kvp => kvp.Key, kvp => kvp.Value);

এটি আপনাকে তালিকার আইটেমটি বিজোড় (1) বা এমনকি (0) ছিল কিনা নামে একটি অভিধান দেবে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.