উত্তর:
আপনি যদি লিনকিউ ব্যবহার করতে পারেন তবে আপনি ব্যবহার করতে পারেন:
var e = enumerable.First();
এটি একটি ব্যতিক্রম ছুঁড়ে ফেলবে যদিও অগণনীয় খালি থাকলে: এক্ষেত্রে আপনি ব্যবহার করতে পারেন:
var e = enumerable.FirstOrDefault();
FirstOrDefault()default(T)যদি গণনাটি খালি থাকে তবে তা ফিরে আসবে , যা nullউল্লেখের ধরণের জন্য বা মান ধরণের জন্য ডিফল্ট 'শূন্য-মান' হবে।
আপনি যদি লিনকিউ ব্যবহার করতে না পারেন, তবে আপনার পদ্ধতিটি প্রযুক্তিগতভাবে সঠিক এবং প্রথম ফলাফলটি পুনরুদ্ধার করার জন্য পদ্ধতিগুলি GetEnumeratorএবং MoveNextপদ্ধতি ব্যবহার করে একটি গণক তৈরির চেয়ে আলাদা নয় (এই উদাহরণটি গণনাযোগ্য হ'ল একটি IEnumerable<Elem>):
Elem e = myDefault;
using (IEnumerator<Elem> enumer = enumerable.GetEnumerator()) {
if (enumer.MoveNext()) e = enumer.Current;
}
জোয়েল কোহোর্ন.Single() মন্তব্যগুলিতে উল্লেখ করেছেন; এটিও কার্যকর হবে, যদি আপনি নিজের সংখ্যাটি হুবহু একটি উপাদান অন্তর্ভুক্ত করে রাখার প্রত্যাশা করে থাকেন - তবে এটি যদি একটি উপাদান থেকে খালি বা বড় হয় তবে এটি ব্যতিক্রম করবে will একটি অনুরূপ SingleOrDefault()পদ্ধতি রয়েছে যা একই দৃশ্যে এই দৃশ্যটি coversেকে দেয় FirstOrDefault()। যাইহোক, ডেভিড বি ব্যাখ্যা করেছেন যে SingleOrDefault()গণনার ক্ষেত্রে একাধিক আইটেম রয়েছে এমন ক্ষেত্রে এখনও একটি ব্যতিক্রম হতে পারে।
সম্পাদনা করুন: মার্ক মার্ক গ্র্যাভেলকে উল্লেখ করার জন্য ধন্যবাদ যে আমার জিনিসটি ব্যবহার করার IEnumeratorপরে তা নিষ্পত্তি করতে হবে - আমি usingএই প্যাটার্নটি বাস্তবায়নের জন্য কীওয়ার্ডটি প্রদর্শনের জন্য নন-লিনক উদাহরণ সম্পাদনা করেছি ।
আপনি যদি নেট নেট ২.০ ব্যবহার করছেন এবং লিনকিউতে অ্যাক্সেস না পেয়ে থাকেন তবে:
static T First<T>(IEnumerable<T> items)
{
using(IEnumerator<T> iter = items.GetEnumerator())
{
iter.MoveNext();
return iter.Current;
}
}
এটি আপনি যা খুঁজছেন তা করা উচিত ... এটি জেনেরিকগুলি ব্যবহার করে যাতে আপনি যেকোন প্রকারের আইমনামেবলের প্রথম আইটেমটি পেতে পারেন।
এটি যেমন কল:
List<string> items = new List<string>() { "A", "B", "C", "D", "E" };
string firstItem = First<string>(items);
অথবা
int[] items = new int[] { 1, 2, 3, 4, 5 };
int firstItem = First<int>(items);
.NET 3.5 এর IEnumerable.ElementAt () এক্সটেনশন পদ্ধতির নকল করার জন্য আপনি এটি সহজেই পর্যাপ্ত পরিমাণে পরিবর্তন করতে পারেন:
static T ElementAt<T>(IEnumerable<T> items, int index)
{
using(IEnumerator<T> iter = items.GetEnumerator())
{
for (int i = 0; i <= index; i++, iter.MoveNext()) ;
return iter.Current;
}
}
এটিকে এভাবে কল করা:
int[] items = { 1, 2, 3, 4, 5 };
int elemIdx = 3;
int item = ElementAt<int>(items, elemIdx);
অবশ্যই আপনি কি LINQ অ্যাক্সেস না থেকে থাকে তাহলে ভাল উত্তর প্রচুর ইতিমধ্যে পোস্ট হয় ...
ঠিক আছে, আপনি .NET এর কোন সংস্করণটি নির্দিষ্ট করেন নি।
ধরে নিলাম আপনার 3.5 আছে, অন্য একটি উপায় এলিমেন্টআট পদ্ধতি:
var e = enumerable.ElementAt(0);
Elem e = enumerable.FirstOrDefault();
//do something with e
ইতিমধ্যে উল্লিখিত হিসাবে ফার্স্টআরডিফল্ট বা একটি অগ্রণী লুপ ব্যবহার করুন। ম্যানুয়ালি একটি গণনা করা এবং বর্তমান কল করা এড়ানো উচিত। foreach আপনার জন্য আপনার গণনা নিষ্পত্তি করবে যদি এটি অগ্রহণীয় প্রয়োগ করে। মুভনেক্সট এবং কারেন্টকে কল করার সময় আপনাকে এটিকে ম্যানুয়ালি নিষ্পত্তি করতে হবে (যদি আবেদনযোগ্য)।
যদি আপনার IEnumerable এটি প্রকাশ করে না <T>এবং লিনক ব্যর্থ হয়, আপনি প্রতিবিম্ব ব্যবহার করে একটি পদ্ধতি লিখতে পারেন:
public static T GetEnumeratedItem<T>(Object items, int index) where T : class
{
T item = null;
if (items != null)
{
System.Reflection.MethodInfo mi = items.GetType()
.GetMethod("GetEnumerator");
if (mi != null)
{
object o = mi.Invoke(items, null);
if (o != null)
{
System.Reflection.MethodInfo mn = o.GetType()
.GetMethod("MoveNext");
if (mn != null)
{
object next = mn.Invoke(o, null);
while (next != null && next.ToString() == "True")
{
if (index < 1)
{
System.Reflection.PropertyInfo pi = o
.GetType().GetProperty("Current");
if (pi != null) item = pi
.GetValue(o, null) as T;
break;
}
index--;
}
}
}
}
}
return item;
}
আপনি আরও জেনেরিক সংস্করণ চেষ্টা করতে পারেন যা আপনাকে ith উপাদান দেয়
enumerable.ElementAtOrDefault (ঝ));
আশা করি এটা সাহায্য করবে