কীভাবে একটি IEnumerable <স্ট্রিং> বাছাই করবেন


99

আমি কীভাবে IEnumerable<string>বর্ণানুক্রমিকভাবে বাছাই করতে পারি । এটা কি সম্ভব?

সম্পাদনা করুন: আমি কীভাবে একটি অন্তর্ভুক্ত সমাধান লিখব?

উত্তর:


157

আপনি অন্য যে কোনও গণনাকারী বাছাই করতে চান:

var result = myEnumerable.OrderBy(s => s);

বা

var result = from s in myEnumerable
             orderby s
             select s;

বা (উপেক্ষা কেস)

var result = myEnumerable.OrderBy(s => s,
                                  StringComparer.CurrentCultureIgnoreCase);

মনে রাখবেন, লিনকুই-র মতো যথারীতি এটি একটি নতুন আইনিউমেবল <T> তৈরি করে, যা যখন গণনা করা হয়, তখন মূল আইনামেবল <T> এর উপাদানগুলি সাজানো ক্রমে ফিরে আসে। এটি স্থলভাগের <<> স্থানে বাছাই করে না।


একটি IEnumerable <T> কেবল পঠনযোগ্য, এটি হ'ল আপনি কেবল এটি থেকে উপাদানগুলি পুনরুদ্ধার করতে পারেন, তবে এটি সরাসরি সংশোধন করতে পারবেন না। যদি আপনি জায়গায় স্ট্রিংয়ের একটি সংগ্রহকে বাছাই করতে চান তবে আপনাকে মূল সংগ্রহটি বাছাই করতে হবে যা আইয়ুনামেবল <স্ট্রিং> প্রয়োগ করে, বা একটি প্রাথমিক স্তরের <স্ট্রিং> কে প্রথমে বাছাইযোগ্য সংগ্রহের মধ্যে পরিণত করতে হবে:

List<string> myList = myEnumerable.ToList();
myList.Sort();

আপনার মন্তব্যের ভিত্তিতে:

_components = (from c in xml.Descendants("component")
               let value = (string)c
               orderby value
               select value
              )
              .Distinct()
              .ToList();

বা

_components = xml.Descendants("component")
                 .Select(c => (string)c)
                 .Distinct()
                 .OrderBy(v => v)
                 .ToList();

বা (আপনি যদি পরে তালিকায় আরও আইটেম যুক্ত করতে চান এবং এটি বাছাই করতে চান)

_components = xml.Descendants("component")
                 .Select(c => (string)c)
                 .Distinct()
                 .ToList();

_components.Add("foo");
_components.Sort();

বা myEnumerable.OrderByDescending (s => s)।
গ্রোজ 19

সুতরাং, _ সংস্থাগুলি = _ উপাদানসমূহ O অর্ডারবাই (গুলি => গুলি); ভাল হবে?
ক্যাটজিলা

@ গেটজিলা: এটি কাজ করা উচিত, তবে আপনার প্রকৃত সমস্যা সমাধানের সেরা উপায় নাও হতে পারে। _ উপাদানগুলি কী, আপনি এটি কোথা থেকে পাবেন, আপনি কীভাবে এটি ব্যবহার করবেন?
dtb

4
@dtb: ওহ, _ উপাদানগুলি একটি এক্সএমএল ফাইল থেকে যথাযথভাবে পপুলেশন করা হয়েছে: _ সংস্থাগুলি = (এক্সএমএল থেকে সি থেকে। এবং আমি এটি বাছাই করা প্রয়োজন।
ক্যাটজিলা

4
OrderByআয় IOrderedEnumerable<T>IOrderedEnumerable<T>থেকে আহরিত IEnumerable<T>তাই এটি মত ব্যবহার করা যেতে পারে IEnumerable<T>, কিন্তু এটা প্রসারিত করে, উদাহরণস্বরূপ, যার ফলে ব্যবহারের জন্য ThenBy
ম্যাকিয়েজ হেল

12

এটা অসম্ভব, তবে তা নয়।

মূলত, কোন ধরণের পদ্ধতি আপনার কপি করা যাচ্ছে IEnumerableএকটি মধ্যে Listসাজানোর, Listএবং তারপর আপনি করতে অনুসারে সাজানো তালিকা, যা একটি আসতে IEnumerableএকটি সেইসাথে IList

এর অর্থ আপনি কোনওটির "অসীম অব্যাহত" সম্পত্তি হারাতে পারেন IEnumerableতবে তারপরেও আপনি এর মতো কোনওটিকে বাছাই করতে পারেন না।


7
ঠিক. আইনিউমারেবলের উদ্দেশ্য হ'ল "পরবর্তী" আইটেমটি জিজ্ঞাসা করে অবিরত হতে শুরু করে এমন সিরিজটিতে আপনাকে এমন একটি হ্যান্ডেল দিয়ে হাজির করা। এর অর্থ হ'ল সমস্ত বিষয়বস্তু জানা হওয়ার আগে একটি আইওয়ানমেন্টে আংশিক পুনরাবৃত্তি করা যেতে পারে; আপনার না হওয়া পর্যন্ত আপনি কখনই সেগুলির মধ্য দিয়ে চলেছেন তা জানতে হবে না। বাছাই (যেমন লিংক আপনাকে অনেকগুলি করতে দেয়) অর্ডার করা তালিকা হিসাবে পুরো সিরিজটির জ্ঞান প্রয়োজন; সাজানো সিরিজে প্রথম যে আইটেমটি প্রদর্শিত হবে তা কোনও সিরিজ দ্বারা ফিরে আসা শেষ হতে পারে এবং আপনি জানেন না যে আপনি সমস্ত আইটেম কী তা না জানলে।
কিথস


2

আমরা সবসময় এটি জায়গায় রাখতে পারি না, তবে কখন সম্ভব হয় তা আমরা সনাক্ত করি:

IEnumerable<T> SortInPlaceIfCan(IEnumerable<T> src, IComparer<T> cmp)
{
  List<T> listToSort = (src is List<T>) ? (List<T>)src : new List<T>(src);
  listToSort.Sort(cmp);
  return listToSort;
}
IEnumerable<T> SortInPlaceIfCan(IEnumerable<T> src, Comparison<T> cmp)
{
  return SortInPlaceIfCan(src, new FuncComparer<T>(cmp));
}
IEnumerable<T> SortInPlaceIfCan(IEnumerable<T> src)
{
  return SortInPlaceIfCan(src, Comparer<T>.Default);
}

এটি নিম্নলিখিত হ্যান্ড স্ট্রাক্ট ব্যবহার করে:

internal struct FuncComparer<T> : IComparer<T>
{
  private readonly Comparison<T> _cmp;
  public FuncComparer(Comparison<T> cmp)
  {
      _cmp = cmp;
  }
  public int Compare(T x, T y)
  {
      return _cmp(x, y);
  }
}

আমি এটি সুপারিশ করছি কিনা তা নিশ্চিত নই। আপনার যদি একটি অনুমানযোগ্য <টি> থাকে তবে প্রকৃত প্রকারটি প্রয়োগ করে তা না জানেন তবে আপনার সম্ভবত এটি পরিবর্তন করা উচিত নয়। বিটিডব্লিউ, অ্যারে.ফন্টাক্টর কম্পিউটার <টি> অভ্যন্তরীণ।
dtb

আমাদের যা আছে তা সংশোধন করার সময়, আমি স্থিরভাবে সন্ধানের প্রশ্নে জড়িত থাকার বিষয়টি নিয়েছি; এটি এটি বোঝায়। পদ্ধতির নামে "ইনপ্লেসইনক্যান" থাকার একটি কারণ; পদ্ধতির নামগুলি সর্বোত্তম ডকুমেন্টেশনের চেয়ে ঝুঁকি সম্পর্কে আরও সুস্পষ্ট হতে পারে;) হ্যাঁ, অ্যারে un ফাংশনকম্পার <টি> অভ্যন্তরীণ তবে এটি তুচ্ছ। আমি এটিকে রেখেছি কারণ এটি "সেরা সাহায্যকারী শ্রেণীর সেট-আপে আপনার ফ্যান্ট্যাক্ট তুলনাকারী আপনার জন্য রয়েছে" উদাহরণ হিসাবে আমি ভাবতে পারি।
জন হান্না

দ্বিতীয় চিন্তা @dtb, আমার নিজের ব্যবহার করার জন্য পরিবর্তিত (আবার Array.FunctorComparer নিয়ে গবেষণা শুরু করেন এবং আমি যাহাই হউক না কেন খনি পছন্দ করা!)
জন হানা

স্মার্ট ধারণা এবং নামকরণ! তবে কেন ডাবল কাস্টিং এন্টি প্যাটার্ন ইন listToSort = (src is List<T>) ? (List<T>)src : new List<T>(src);? এটির মতো থাকার বিষয়েlistToSort = (src as List<T>); if (null == listToSort) listToSort = new List<T>(src);
জেরোয়েন ওয়েয়ার্ট প্লুইমারস

4
@ জিরোইনওয়েয়ারটপ্লাইমারগুলি এখানে সবসময় উদাহরণ কোড সহ সমস্যা থাকে; সম্ভবত আমি বিরক্ত করিনি কারণ উপরেরটি কিছুটা সংক্ষিপ্ত এবং আমি বিষয়টি হাতে নিয়ে মনোনিবেশ করতে চেয়েছিলাম তবে উদাহরণের মধ্যেও খারাপ অভ্যাসকে নিরুৎসাহিত করা ভাল।
জন হানা
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.