আমি একটি তালিকা <>> এ শেষ উপাদানটি কীভাবে খুঁজে পাব?


172

নিম্নলিখিতটি আমার কোড থেকে একটি নির্যাস:

public class AllIntegerIDs 
{
    public AllIntegerIDs() 
    {            
        m_MessageID = 0;
        m_MessageType = 0;
        m_ClassID = 0;
        m_CategoryID = 0;
        m_MessageText = null;
    }

    ~AllIntegerIDs()
    {
    }

    public void SetIntegerValues (int messageID, int messagetype,
        int classID, int categoryID)
    {
        this.m_MessageID = messageID;
        this.m_MessageType = messagetype;
        this.m_ClassID = classID;
        this.m_CategoryID = categoryID;
    }

    public string m_MessageText;
    public int m_MessageID;
    public int m_MessageType;
    public int m_ClassID;
    public int m_CategoryID;
}

আমি আমার মূল () ফাংশন কোডটিতে নিম্নলিখিতটি ব্যবহার করার চেষ্টা করছি:

List<AllIntegerIDs> integerList = new List<AllIntegerIDs>();

/* some code here that is ised for following assignments*/
{
   integerList.Add(new AllIntegerIDs());
   index++;
   integerList[index].m_MessageID = (int)IntegerIDsSubstring[IntOffset];
   integerList[index].m_MessageType = (int)IntegerIDsSubstring[IntOffset + 1];
   integerList[index].m_ClassID = (int)IntegerIDsSubstring[IntOffset + 2];
   integerList[index].m_CategoryID = (int)IntegerIDsSubstring[IntOffset + 3];
   integerList[index].m_MessageText = MessageTextSubstring;
}

সমস্যা এখানে: আমি লুপের জন্য লুপ ব্যবহার করে আমার তালিকার সমস্ত উপাদান মুদ্রণের চেষ্টা করছি:

for (int cnt3 = 0 ; cnt3 <= integerList.FindLastIndex ; cnt3++) //<----PROBLEM HERE
{
   Console.WriteLine("{0}\t{1}\t{2}\t{3}\t{4}\n", integerList[cnt3].m_MessageID,integerList[cnt3].m_MessageType,integerList[cnt3].m_ClassID,integerList[cnt3].m_CategoryID, integerList[cnt3].m_MessageText);
}

আমি সর্বশেষ উপাদানটি সন্ধান করতে চাই যাতে আমি লুপের জন্য আমার সিএনটি 3 এর সমীকরণ করি এবং তালিকার সমস্ত এন্ট্রি মুদ্রণ করি। তালিকার প্রতিটি উপাদান হ'ল উপরে উল্লিখিত কোড নমুনায় শ্রেণীর AllIntegerIDs শ্রেণীর একটি অবজেক্ট। আমি তালিকার শেষ বৈধ এন্ট্রিটি কীভাবে খুঁজে পাব?

আমি কি পূর্ণসংখ্যার মতো কিছু ব্যবহার করব indফাইন্ড (পূর্ণসংখ্যা তালিকা [] m m_MessageText == নাল;

যদি আমি এটি ব্যবহার করি তবে এটির জন্য এমন একটি সূচি প্রয়োজন যা সর্বনিম্ন 0 থেকে শুরু করে। মানে লুপের জন্য আমাকে অন্যটি ব্যবহার করতে হবে যা আমি ব্যবহার করার ইচ্ছা করি না। আরও কি আরও ছোট / ভাল উপায় আছে?

ধন্যবাদ, বীরেন


@ ভাইরেন: কোডটি সঠিকভাবে প্রদর্শন করার জন্য আমি কোড লিখেছিলাম। আপনি যদি আমার অধীনে সম্পাদনা করেন তবে আপনি কি নিশ্চিত করতে পারেন যে আমি সেগুলি পূর্বাবস্থায় ফেলি নি?
স্যাম হারওয়েল

8
আপনার প্রশ্নের সাথে সম্পর্কিত নয়, তবে আপনার চূড়ান্তকরণের প্রয়োজন হয় না যদি না এটি প্রয়োজন হয় না।
ব্রায়ান রাসমুসেন

প্রশ্নের সাথে সম্পর্কিত নয়, তবে পঠনযোগ্যতা এবং রক্ষণাবেক্ষণের জন্য, আমি আপনাকে পরামর্শ দিচ্ছি AllIntegerIDs newItem = new AllIntegerID();, সমস্ত ক্ষেত্র বরাদ্দ করতে এটি ব্যবহার করুন এবং তারপরে কল করুন integerList.Add(newItem)। অথবা ক্ষেত্রের চেয়ে বৈশিষ্ট্যগুলি ব্যবহার করুন এবং সি # 3.0 অবজেক্ট ইনিশিয়ালাইজার সিনট্যাক্স ব্যবহার করুন।
থোররিন

উত্তর:


208

আপনি যদি কেবল তালিকার শেষ আইটেমটি অ্যাক্সেস করতে চান তবে আপনি করতে পারেন

if(integerList.Count>0)
{
   var item = integerList[integerList.Count - 1];
}

তালিকার মোট আইটেমের সংখ্যা পেতে আপনি গণনা সম্পত্তিটি ব্যবহার করতে পারেন

var itemCount = integerList.Count;

17
@Jared আমি মনে করি আপনি এই লাইন যোগ করতে ভুলে গেছি "যদি (integerList.Count = 0!)" প্রথম লাইন সামনে
প্রভাকরণ

21
এই আইএমএইচও এটি শীর্ষ উত্তর হওয়ার প্রাপ্য নয়, এটি ভয়ঙ্করভাবে পড়ে এবং যদি গণনা শূন্য হয় তবে একটি ত্রুটির সুযোগ ছেড়ে দেয়। CleanCode ™ পদ্ধতির ব্যবহার করতে হবে Last/ LastOrDefaultনিচে উল্লিখিত হিসাবে।
চিলিটোম

2
পূর্বে উল্লিখিত হিসাবে, তালিকাটি খালি থাকলে এবং উত্তর আইএমএইচও ব্যবহার করা উচিত নয় এই উত্তরটি পরিস্থিতি বিবেচনা করে না।
Merrr

2
@ চিলিটম @ মিআরআর লিনকিউ এক্সটেনশন পদ্ধতিগুলি ব্যবহার করে কোনও লাভ হয় না। Enumerable.Lastতালিকাটি খালি থাকলে একটি ব্যতিক্রম ছুঁড়ে ফেলবে। যদি আপনি কল করে Enumerable.LastOrDefaultএবং মান ধরণের একটি তালিকা পাস করেন তবে তালিকাটি খালি থাকলে ডিফল্ট মানটি ফিরে আসবে। সুতরাং আপনি যদি 0 টি থেকে ফিরে পান তবে আপনি জানতে List<int>পারবেন না যে তালিকাটি খালি ছিল বা শেষ মান 0 ছিল, সংক্ষেপে, আপনি Countযেটি পুনরুদ্ধার পদ্ধতি ব্যবহার করবেন তা পরীক্ষা করে দেখতে হবে।
0b101010

4
@ চিলিটোম প্রত্যেকে তাদের নিজস্ব। উদাহরণস্বরূপ যেখানে আপনি জানেন যে একটি তালিকা জনবহুল, আমি মনে করি var element = list[list.Count - 1]খুব সংক্ষিপ্ত এবং পাঠযোগ্য। এক্সটেনশন পদ্ধতিগুলি
চাওয়ার

276

কোনও সংগ্রহের শেষ আইটেমটি পেতে লাস্টআরডেফল্ট () এবং শেষ () এক্সটেনশন পদ্ধতিগুলি ব্যবহার করুন

var lastItem = integerList.LastOrDefault();

অথবা

var lastItem = integerList.Last();

স্মরণকারী যুক্ত করতে using System.Linq;, বা এই পদ্ধতিটি উপলব্ধ হবে না।


17
হ্যাঁ এটি সর্বোত্তম উপায়, সর্বশেষ এবং সর্বশেষের ডিফল্ট তালিকা <> এর
চিলিটিম

2
@ গুডোর আমি এটি নথিভুক্ত দেখিনি তবে আমি কেবল এই বিষয়গুলির জন্য সরাসরি উত্সগুলি (বা রেসার্পার, ডটপিক বা আইএলএসপি এর মতো একটি বিচ্ছিন্ন ব্যবহারকারী) ব্যবহার করতে চাইছি। থেকে সেখানে আমি দেখতে পারেন First, FirstOrDefault, Last, LastOrDefault, Single, SingleOrDefault, ElementAtএবং ElementAtOrDefaultজন্য অপ্টিমাইজ করা হয় IList<TSource>, Countএবং Containsজন্য অপ্টিমাইজ করা হয় ICollection<TSource>এবং Cast<TResult>জন্য অপ্টিমাইজ করা হয় IEnumerable<TResult>
চিলিটোম

8
যোগ করার জন্য নিশ্চিত করুনusing System.Linq;
হাইব্রিড

4
@ চিলিটোম দ্বারা প্রকাশিত এক্সটেনশন পদ্ধতিগুলি System.Linq.Enumerableআসলে 'অনুকূলিত' হয় না। Enumerable.Lastপদ্ধতির কোড এখানে ।
0b101010

4
@chillitom উৎস পড়ার পর System.Linq.Enumerable.Last, আমি 0b101010 সাথে একমত - Last()কোড করা হয় না "জন্য অপ্টিমাইজ করা List<>গুলি" - Last()ঠিক একটি কুশ্রী মোড়কের, যা ডিফল্টে return list[list.Count-1]ক্ষেত্রে যুক্তি একটি হল IList, এবং iterates ক্ষেত্রে শেষ পর্যন্ত তালিকা উপর এটা না ... এটি একটি অত্যন্ত দরিদ্র সমাধান উপার্জন যদি IListএকটি হয় LinkedList, যেহেতু indexer শুধু অযথা সম্পূর্ণ তালিকা মাধ্যমে যেতে হবে (আমি একটি ওভাররাইড উপর পিছন iterating খুঁজে পেলাম না Item[]সূচক> কাউন্ট / 2 C # সূত্র এ, YMMV সঙ্গে )

20

প্রশ্নের তালিকায় আসুন, কীভাবে কোনও তালিকার শেষ উপাদানটিকে নিরাপদে সম্বোধন করা যায় ...

অভিমানী

List<string> myList = new List<string>();

তারপর

//NOT safe on an empty list!
string myString = myList[myList.Count -1];

//equivalent to the above line when Count is 0, bad index
string otherString = myList[-1];

"গণনা -১" একটি খারাপ অভ্যাস যা আপনি প্রথমে গ্যারান্টি ছাড়াই তালিকাটি খালি নয়।

খালি তালিকার জন্য এটি করা ছাড়া চেক করার পক্ষে কোনও সুবিধাজনক উপায় নেই।

সবচেয়ে কম উপায় আমি ভাবতে পারি of

string myString = (myList.Count != 0) ? myList [ myList.Count-1 ] : "";

আপনি সর্বদা বাইরে গিয়ে কোনও প্রতিনিধি তৈরি করতে পারেন যা সর্বদা সত্য হয়, এবং এটি ফাইন্ডলাস্টে প্রেরণ করতে পারে যা শেষ মানটি (বা তালিকাটি ফাঁকা থাকলে ডিফল্ট নির্মানকৃত ভালই) ফিরিয়ে দেবে। এই ফাংশনটি তালিকার শেষে শুরু হয় তাই পদ্ধতিটি সাধারণত ও (এন) হওয়া সত্ত্বেও বিগ ও (1) বা ধ্রুবক সময় হতে পারে।

//somewhere in your codebase, a strange delegate is defined
private static bool alwaysTrue(string in)
{
    return true;
}

//Wherever you are working with the list
string myString = myList.FindLast(alwaysTrue);

আপনি যদি প্রতিনিধি অংশটি গণনা করেন তবে ফাইন্ডলাস্ট পদ্ধতিটি কুৎসিত, তবে এটি কেবলমাত্র এক জায়গা হিসাবে ঘোষণা করা দরকার। যদি তালিকাটি খালি থাকে তবে এটি স্ট্রিংয়ের জন্য তালিকার ধরণের "" ডিফল্ট নির্মিত মানকে ফিরিয়ে দেবে। সর্বদা ট্র্রু প্রতিনিধিকে আরও একধাপ এগিয়ে নিয়ে যাওয়া, স্ট্রিং টাইপের পরিবর্তে এটি একটি টেম্পলেট তৈরি করা আরও কার্যকর হবে।


2
প্রতিনিধিটিকে ল্যাম্বডা এক্সপ্রেশন দিয়ে প্রতিস্থাপন করা যায়: myList.FindLast(_unused_variable_name => true);এটি নির্বিশেষে কাজ করবে। একটি সংক্ষিপ্ত সংস্করণ হ'ল myList.FindLast(_ => true);তবে আমি কেবল আন্ডারস্কোর (বা অন্য কোনও একক চরিত্র শনাক্তকারী) দেখতে পাই কিছু সময় বিভ্রান্তিকর হতে পারে।
বব


5

পরিবর্তন

for (int cnt3 = 0 ; cnt3 <= integerList.FindLastIndex ; cnt3++)

প্রতি

for (int cnt3 = 0 ; cnt3 < integerList.Count; cnt3++)

foreach প্রায়শই ব্যবহার করা আরও সুবিধাজনক, তবে খুব কম ধীর।
এরিক জে।

যদি গণনা ... a -1 ব্যবহার করেন বা আপনি একটি সূচক ত্রুটি পাবেন। (int cnt3 = 0; cnt3 <পূর্ণসংখ্যার তালিকা.কাউন্ট - 1; cnt3 ++)
রিডলারডেভ

4
এজন্যই আমি <= to <পরিবর্তন করেছি। কোড পোস্ট হিসাবে সঠিক :-)
এরিক জে।

@ এরিক: এটি আস্তে আস্তে ব্যবহৃত হত, তবে এটি জেআইটি-তে আঘাত হানার পক্ষে একটি তুচ্ছ ঘটনা, যাতে তারা যদি এখন না করে থাকে তবে আমি অবাক হব। : ডুনো:
স্যাম হারওয়েল

1
@IPX এরিস: এখনও ডেটা ধরনের উপর নির্ভর করে একটি বিষয় মনে করা হয় আপনি iterating হয়: stackoverflow.com/questions/365615/...
এরিক জে


2

আপনি তালিকার প্রথম উপাদানের সংখ্যা গণনা করে এটি সন্ধান করতে পারেন উদাহরণস্বরূপ

int count = list.Count();

তারপরে আপনি তালিকার তালিকাতে শেষ উপাদানটি পেতে 1 - গণনা সূচক করতে পারেন

int lastNumber = list[count - 1];

2
সদৃশ উত্তর পোস্ট করবেন না।
ইয়ান মেরার



0

আপনার আসল প্রশ্নের থেকে আলাদা, আপনি যদি একাধিকবার আপনার তালিকায় সূচী না হয়ে স্থানীয় ভেরিয়েবলের রেফারেন্সগুলি ক্যাপচার করেন তবে আপনি আরও ভাল পারফরম্যান্স পাবেন:

AllIntegerIDs ids = new AllIntegerIDs();
ids.m_MessageID = (int)IntegerIDsSubstring[IntOffset];
ids.m_MessageType = (int)IntegerIDsSubstring[IntOffset + 1];
ids.m_ClassID = (int)IntegerIDsSubstring[IntOffset + 2];
ids.m_CategoryID = (int)IntegerIDsSubstring[IntOffset + 3];
ids.m_MessageText = MessageTextSubstring;
integerList.Add(ids);

এবং আপনার forলুপে:

for (int cnt3 = 0 ; cnt3 < integerList.Count ; cnt3++) //<----PROBLEM HERE
{
   AllIntegerIDs ids = integerList[cnt3];
   Console.WriteLine("{0}\t{1}\t{2}\t{3}\t{4}\n",
      ids.m_MessageID,ids.m_MessageType,ids.m_ClassID,ids.m_CategoryID, ids.m_MessageText);
}

-1

আমি একটি ভবিষ্যদ্বাণী একমত হতে হবে অনেক সহজ কিছু হতে পারে

foreach(AllIntegerIDs allIntegerIDs in integerList)
{
Console.WriteLine("{0}\t{1}\t{2}\t{3}\t{4}\n", allIntegerIDs.m_MessageID,
allIntegerIDs.m_MessageType,
allIntegerIDs.m_ClassID,
allIntegerIDs.m_CategoryID,
allIntegerIDs.m_MessageText);
}

এছাড়াও আমি আপনাকে পরামর্শ দিচ্ছি যে আপনি আপনার সর্বজনীন ক্ষেত্রগুলির পরিবর্তে আপনার তথ্য অ্যাক্সেস করার জন্য বৈশিষ্ট্য যুক্ত করুন, আপনার। নেট সংস্করণের উপর নির্ভর করে আপনি এটি পছন্দ মতো যুক্ত করতে পারেন public int MessageType {get; set;}এবং m_আপনার পাবলিক ফিল্ডগুলি, বৈশিষ্ট্যগুলি ইত্যাদি যেখানে তা না পাওয়া উচিত তা থেকে মুক্তি পেতে পারেন ।


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