তালিকায় স্বতন্ত্র মানগুলির একটি তালিকা পান


175

সি # তে, বলুন আমার কাছে তিনটি স্ট্রিং সদস্য ভেরিয়েবল সহ নোট নামে একটি ক্লাস রয়েছে।

public class Note
{
    public string Title;
    public string Author;
    public string Text;
}

এবং আমার কাছে টাইপ নোটের একটি তালিকা রয়েছে:

List<Note> Notes = new List<Note>();

লেখকের কলামে সমস্ত স্বতন্ত্র মানগুলির তালিকা পাওয়ার সবচেয়ে সহজ উপায় কী হবে?

আমি তালিকার মধ্য দিয়ে পুনরাবৃত্তি করতে এবং সমস্ত মানগুলি যুক্ত করতে পারি যা স্ট্রিংয়ের অন্য তালিকায় সদৃশ নয় তবে এটি নোংরা এবং অদক্ষ মনে হয়। আমার মনে হয় কিছু জাদুকরী লিনক নির্মাণ রয়েছে যা এটি এক লাইনে করে ফেলবে, তবে আমি কিছুই নিয়ে আসতে সক্ষম হইনি।

উত্তর:


331
Notes.Select(x => x.Author).Distinct();

এটি মানগুলির একটি ক্রম ( IEnumerable<string>) ফিরিয়ে দেবে Author- প্রতি অনন্য মানের জন্য একটি।


1
নোট.সিলিট (x => x.Author) .এএসপ্যারালাল ()। ডিস্টিনেক্ট (); যদি আমরা অর্ডারের বিষয়ে যত্ন না করি এবং তালিকায় আরও আইটেম থাকে তবে "AsPa Parall ()" কিছুটা পারফরম্যান্স সুবিধা দিতে পারে।
সাঁই

1
সমাপ্তি তুলনামূলক বিবেচনা করে কিকিনিট, স্বতন্ত্র Defaultmsdn.microsoft.com/en-us/library/bb348436(v=vs.110).aspx
জর্জি প্যাটসিডার

.Distinct () এর আগে আমাদের কি ToList () যুক্ত করা দরকার?
ফান Đức বানহ

1
ডিস্ট্রিঙ্ক্ট () এর আগে নয় তবে পরে, যদি আপনি কোনও তালিকায় রূপান্তর করার চেষ্টা করছেন। উদাঃ নোট.সিলিট (x => x.Author)। ডিসিস্টিন্ট ()। টু লিস্ট ();
এমটিউইফোর্ড

87

লেখক দ্বারা নোট শ্রেণি আলাদা করুন

var DistinctItems = Note.GroupBy(x => x.Author).Select(y => y.First());

foreach(var item in DistinctItems)
{
    //Add to other List
}

1
এমন তো হওয়ার কথা নয় Notesহিসাবে Notes.GroupBy()একটি বহুবচন সঙ্গে sযেমন Noteশুধুমাত্র একটি একক নোট রাখবে?
kkuilla

30

জন স্কিটি মোড়লিংক নামে একটি গ্রন্থাগার লিখেছেন যার DistinctBy()অপারেটর রয়েছে। বাস্তবায়নের জন্য এখানে দেখুন । আপনার কোড মত লাগবে

IEnumerable<Note> distinctNotes = Notes.DistinctBy(note => note.Author);

আপডেট: আপনার প্রশ্নটি পুনরায় পড়ার পরে, আপনি যদি কেবল লেখকের একটি স্বতন্ত্র সেট খুঁজছেন তবে কার্কের সঠিক উত্তর রয়েছে।

ডিস্টিন্টবাইয়ের কয়েকটি ক্ষেত্রের নমুনা যুক্ত হয়েছে:

res = res.DistinctBy(i => i.Name).DistinctBy(i => i.ProductId).ToList();

চমৎকার আপনাকে ধন্যবাদ. আমি পছন্দ করি যে আমি ডিসট্রিন্ট পদ্ধতিটি কল করার আগে তালিকার অর্ডার দিলে এটি সঠিক ক্রমটি রাখে।
ভিলহেল্ম

আমি লিঙ্কগুলি আপডেট করেছি। মোড়লিংকিউ এখন গিথুবে রয়েছে এবং নুগেটের মাধ্যমে ইনস্টল করা যেতে পারে:Install-Package morelinq
চাদ লেভি

2
public class KeyNote
{
    public long KeyNoteId { get; set; }
    public long CourseId { get; set; }
    public string CourseName { get; set; }
    public string Note { get; set; }
    public DateTime CreatedDate { get; set; }
}

public List<KeyNote> KeyNotes { get; set; }
public List<RefCourse> GetCourses { get; set; }    

List<RefCourse> courses = KeyNotes.Select(x => new RefCourse { CourseId = x.CourseId, Name = x.CourseName }).Distinct().ToList();

উপরের যুক্তি ব্যবহার করে আমরা অনন্যটি পেতে পারি Course


টোললিস্টে আমার সময় বাঁচানোর আগে আপনার বিচ্ছিন্নতা .. আমি টোললিস্টের পরে করছি এবং সেই ত্রুটিটি দিচ্ছি যা তালিকাকে আইয়েনামেবলে রূপান্তর করতে পারে না।
অজয় 2707

স্বতন্ত্রতা এখানে কাজ করবে না কারণ এই অপারেটরের জন্য প্রতিটি বস্তুর হ্যাশকোডের ভিত্তিতে অনন্য। আপনার এর সাথে কিছু মিল দরকার - github.com/morelinq/MoreLINQ/blob/master/MoreLinq/DistinctBy.cs
বোস_জেক

-2
mcilist = (from mci in mcilist select mci).Distinct().ToList();

এমসিআই আসলে কি? শুধু উদাহরণ টেবিল? উত্তরটি যেমন কিছুটা বিশ্রী তেমনি।
ব্র্যাড কোচ

1
হ্যাঁ, আমি মনে করি না যে এটি আমার আসল প্রশ্নটি যা করছিল তা করে (মনে করবেন না এটি দেড় বছর আগে হয়েছিল এবং প্রকল্পটি শেষ হওয়ার পরে দীর্ঘ)। আমি যা বলতে পারি তা থেকে এটি কাজ করবে যদি আমার কাছে ইতিমধ্যে লেখকের স্ট্রিংয়ের একটি তালিকা থাকে যাতে নকল থাকতে পারে তবে অবজেক্টের তালিকা থেকে এ জাতীয় তালিকা বের করতে ব্যবহার করা যায়নি যার ক্ষেত্রে তাদের ক্ষেত্রগুলির মধ্যে লেখক স্ট্রিং রয়েছে।
ড্যারেল হফম্যান
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.