তালিকা <T> সন্নিবেশ আদেশের গ্যারান্টি দেয়?


238

বলুন আমার তালিকায় 3 টি স্ট্রিং রয়েছে (যেমন "1", "2", "3")।

তারপরে আমি তাদের "2" পজিশনে 1 (যেমন "2", "1", "3") পুনরায় অর্ডার করতে চাই।

আমি এই কোডটি ব্যবহার করছি (ইনডেক্সটোমোভটোকে 1 এ সেট করে):

listInstance.Remove(itemToMove);
listInstance.Insert(indexToMoveTo, itemToMove);

এটি কাজ করে বলে মনে হচ্ছে, তবে আমি মাঝে মাঝে অদ্ভুত ফলাফল পাচ্ছি; কখনও কখনও ক্রমটি ভুল হয় বা তালিকা থেকে আইটেমগুলি মুছে ফেলা হয়!

কোন ধারনা? কি List<T>গ্যারান্টি অর্ডার?

সম্পর্কিত:

কোনও তালিকা <T> গ্যারান্টি দেয় যে আইটেমগুলি যুক্ত করা হয়েছিল সে অনুযায়ী তাদের ফিরিয়ে দেওয়া হবে?


3
এই সত্য এখানে উল্লিখিত নয়: stackoverflow.com/a/1790318/696517
jrmgx

উত্তর:


311

List<>বর্গ গ্যারান্টি ক্রম আছে - কিছু, আপনি তাদের যোগ করার অনুরূপ সহ তালিকায় রেখে দেওয়া হবে, যদি না আপনি স্পষ্টভাবে সাজানোর তালিকা।

এমএসডিএন অনুসারে:

... তালিকা " সূচক দ্বারা অ্যাক্সেস করা যায় এমন বস্তুর একটি দৃ .়ভাবে টাইপিত তালিকা উপস্থাপন করে ।"

সূচক মানগুলি এটি সঠিক হওয়ার জন্য নির্ভরযোগ্য থাকতে হবে। সুতরাং আদেশ গ্যারান্টিযুক্ত।

আপনি যদি পরে তালিকায় আইটেমটি Remove()সরিয়ে রাখেন তবে আপনি আপনার কোড থেকে অদ্ভুত ফলাফল পাচ্ছেন, কারণ কল করার আগে আপনি অন্যান্য আইটেমগুলিকে এক জায়গায় নামিয়ে দেবেন Insert()

আপনি কি নিজের কোড পোস্ট করতে যথেষ্ট ছোট কিছুতে সিদ্ধ করতে পারেন?


63
ভবিষ্যতের যে কোনও গুগলারের জন্য এখানে তালিকা (টি) এর এমএসডিএন (বোল্ডিং মাইন) থেকে সঠিক উক্তি রয়েছে List তালিকার শেষের সাথে যুক্ত হওয়া
aolszowka

4
এই সম্পর্কে মাইক্রোসফ্ট বা সি # স্পেসিফিকেশন থেকে আমরা আরও নির্দিষ্ট কোন উদ্ধৃতি / রেফারেন্স পেতে পারি? @ আওলসোওকার উক্তিটি অবশ্যই সুনির্দিষ্টভাবে মনে হয়েছে যে এটি সন্নিবেশনের আদেশটি ধরে রাখে, তবে প্রযুক্তিগতভাবে তালিকাটি কোনও আইটেম যুক্ত হওয়ার পরে যে কোনও সময় সংগ্রহটিকে পুনরায় অর্ডার করতে পারে এবং সেই বিবৃতিটি এখনও বৈধ থাকবে। আমি এটি সম্পর্কে নিট-পিক পেতে চাই না, তবে কোনও পরিচালক বা কিউএ যদি সত্যই আমাকে এই অবস্থানটি রক্ষা করতে বাধ্য করে, আমি কেবল সেই উদ্ধৃতি দিয়ে খুব আত্মবিশ্বাসী বোধ করব না।
tehDorf

4
আমি কিছু নিশ্চিতকরণ পেতে দুটি কার্যকর উপায় সম্পর্কে ভাবতে পারি। প্রথমে উত্সটি পড়ুন এবং নিজেকে সন্তুষ্ট করুন। দ্বিতীয়ত, Listকোনও ভাল কম্পিউটার বিজ্ঞানের পাঠ্যপুস্তকে বিমূর্ত তথ্য প্রকারের সংজ্ঞা পরীক্ষা করে দেখুন । ঠিক যেমন Queueএবং Stack, একটি Listএকটি ভাল সংজ্ঞায়িত, পূর্বাভাসযোগ্য এবং ভালভাবে বোঝা ডেটা স্ট্রাকচার - যদি নেট নেটপ্লিকেশন প্রয়োগ হয় (বা এটি পরিবর্তিত হয়) অনেকগুলি সফ্টওয়্যার নষ্ট হয়ে যায়।
বেভান

@tehDorf আমার এটি গ্রহণ (এটি নিয়ে যদি কোনও আলোচনা হতে থাকে) হ'ল: "যদি আদেশটি আপনার পদ্ধতি / অ্যালগরিদমটির ক্রিয়াকলাপকে প্রভাবিত করে তবে আপনার স্পষ্টতই তালিকাটি অর্ডার করা উচিত বা আপনার এপিআই-কে যথাযথ ইন্টারফেস / শ্রেণি যেমন আইওআরডইনমেন্টেবল বা নেওয়া উচিত সাজানো তালিকা, অন্যথায় আপনার কোনও নির্দিষ্ট পদ্ধতিতে আচরণের জন্য কোনও নির্দিষ্ট প্রয়োগের উপর নির্ভর করা উচিত নয় যতক্ষণ না এটি স্পষ্টভাবে নির্বিঘ্নে বলা না হয় "তালিকা <T> স্পষ্টভাবে বাছাই সম্পর্কে আপনাকেও যত্নবান হতে হবে কারণ তাদের প্রয়োগটি একটি অস্থির বাছাই ব্যবহার করে।
আওলসোওকা

1
@achuthakrishnan এগুলি পৃথক বিষয়। তালিকা গ্যারান্টি দেয় যে আইটেমগুলিকে তালিকায় যুক্ত করা হয় সে অনুযায়ী তাদের ধরে রাখা হয়। আপনি যখন Where()তালিকাটি ফিল্টার করার জন্য লিনকিউ পদ্ধতি ব্যবহার করেন , আপনি ক্রম অনুসারে আইটেমগুলি বিবেচনা করার জন্য প্রয়োগের উপর নির্ভর করছেন। এটি ঘটে যা ঘটে ( রেফারেন্সসোর্স.মাইক্রোসফট.কম / সিস্টেমে.কোর / সিস্টেম / লিংক / see দেখুন ) তবে এটি এমএসডিএন তে নথিভুক্ত নয়। আমি এটির আইটেমগুলির ক্রম বজায় রাখার emp.LastOrDefault(x => x.empDept = 'abc')ডকুমেন্টেশন হিসাবে ব্যবহার করার পরামর্শ দেব LastOrDefault()
বেভান

36

এখানে তাদের সূচক সহ 4 টি আইটেম রয়েছে

0  1  2  3
K  C  A  E

আপনি কে কে এ এবং ই এর মধ্যে সরিয়ে নিতে চান - আপনি অবস্থানটি মনে করতে পারেন 3.. আপনি এখানে আপনার সূচী সম্পর্কে সতর্ক হন, কারণ অপসারণের পরে, সমস্ত সূচি আপডেট হয়।

সুতরাং আপনি প্রথমে 0 টি সরান, রেখে

0  1  2
C  A  E

তারপরে আপনি 3 এ .োকান

0  1  2  3
C  A  E  K

সঠিক ফলাফল পেতে আপনার সূচি ২ ব্যবহার করা উচিত things জিনিসগুলি ধারাবাহিক করার জন্য আপনাকে (ইনডেক্সটোমোভটো -১) প্রেরণ করতে হবে if indexToMoveTo > indexToMove, যেমন

bool moveUp = (listInstance.IndexOf(itemToMoveTo) > indexToMove);
listInstance.Remove(itemToMove);
listInstance.Insert(indexToMoveTo, moveUp ? (itemToMoveTo - 1) : itemToMoveTo);

এটি আপনার সমস্যার সাথে সম্পর্কিত হতে পারে। নোট করুন আমার কোডটি অপরিশোধিত!

সম্পাদনা : অন্যথায়, আপনি যদি Sortএকটি কাস্টম তুলক ( IComparer) এর সাথে এটি করতে পারেন যদি এটি আপনার অবস্থার সাথে প্রযোজ্য।


বেভানের প্রতিক্রিয়া মনোযোগ সহকারে পড়েনি, আমি কেবল তার জমিটি আবৃত করেছি।
জোয়েল গুডউইন

9
হ্যাঁ, তবে আপনি বেভানের উত্তরের উদাহরণ সহ কিছু সমাধান কোড দিয়েছেন, তাই আপনার উত্তরটি টোটোলজাস নয় এবং আমি আপনাকে ভোট দিয়েছি।
জেসন এস

9

বেভান যেমন বলেছেন, তবে মনে রাখবেন যে তালিকা-সূচকটি 0-ভিত্তিক। আপনি যদি কোনও উপাদানকে তালিকার সামনের দিকে নিয়ে যেতে চান তবে আপনাকে এটি সূচী 0তে প্রবেশ করতে হবে (আপনার উদাহরণে 1 টি নয়)।


1

একটি আইটেমকে তালিকার এক জায়গায় নামানোর জন্য আমার কাছে এই কোডটি রয়েছে:

if (this.folderImages.SelectedIndex > -1 && this.folderImages.SelectedIndex < this.folderImages.Items.Count - 1)
{
    string imageName = this.folderImages.SelectedItem as string;
    int index = this.folderImages.SelectedIndex;

    this.folderImages.Items.RemoveAt(index);
    this.folderImages.Items.Insert(index + 1, imageName);
    this.folderImages.SelectedIndex = index + 1;
 }

এবং এটি এটিকে এক জায়গায় উপরে নিয়ে যাওয়ার জন্য:

if (this.folderImages.SelectedIndex > 0)
{
    string imageName = this.folderImages.SelectedItem as string;
    int index = this.folderImages.SelectedIndex;

    this.folderImages.Items.RemoveAt(index);
    this.folderImages.Items.Insert(index - 1, imageName);
    this.folderImages.SelectedIndex = index - 1;
}

folderImagesঅবশ্যই একটি ListBoxতালিকা তাই তালিকাটি একটি ListBox.ObjectCollectionনয় List<T>, তবে এটি উত্তরাধিকার সূত্রে প্রাপ্ত IListতাই এটি একই আচরণ করা উচিত। এটা কি সাহায্য করে?

অবশ্যই প্রাক্তন কেবল তখনই কাজ করে যদি নির্বাচিত আইটেমি তালিকার শেষ আইটেম না হয় এবং পরে যদি নির্বাচিত আইটেমটি প্রথম আইটেম না হয়।


1

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

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