লিঙ্কে তালিকা থেকে একাধিক ক্ষেত্র নির্বাচন করুন


128

এএসপি.নেট সি # তে আমার একটি স্ট্রাক্ট রয়েছে:

public struct Data
{
    public int item1;
    public int item2;
    public int category_id;
    public string category_name;
}

এবং আমি তাদের একটি তালিকা আছে। আমি নির্বাচন করতে চান category_idএবং category_name, একটি চলমান DISTINCTএবং পরিশেষে একটি ORDERBYউপর category_name

আমার এখন যা আছে তা এখানে:

List<Data> listObject = getData();
string[] catNames = listObject
                    .Select(i=> i.category_name)
                    .Distinct()
                    .OrderByDescending(s => s)
                    .ToArray();

এটি সম্ভবত শ্রেণির নাম পায়। আমার প্রশ্নটি হল, আমি কীভাবে একাধিক ক্ষেত্র পেতে পারি এবং আমি কোন এট্রাক্ট স্ট্রাকচার এ (ক string[]) নয়?

সম্পাদনা

স্ট্রকের একটি তালিকা ব্যবহার করে পাথর সেট করা হয় না। নির্বাচনগুলি সহজ করার জন্য যদি আমার ব্যাকিং ডেটা কাঠামোটি পরিবর্তন করার পরামর্শ দেওয়া হয় (আমি এগুলির মধ্যে অনেকগুলি লিখব) তবে আমি আনন্দের সাথে সুপারিশ গ্রহণ করব।


10
যদিও এটি লিনকিউ পক্ষের সাথে সম্পর্কিত নয়, আমি আপনাকে দৃ strongly ়ভাবে পরামর্শ দিচ্ছি যে পরিবর্তনীয় স্ট্রাক্ট বা পাবলিক ফিল্ড ব্যবহার করবেন না use ব্যক্তিগতভাবে আমি খুব কমই প্রথম স্থানে স্ট্রাক্ট তৈরি করি, তবে পরিবর্তনযোগ্য স্ট্রাক্ট কেবল সমস্যার জন্য জিজ্ঞাসা করছে।
জন স্কিটি

@ জোন স্কিটি ধন্যবাদ আমি এটি ব্যক্তিগত সদস্যদের সাথে একটি নিয়মিত শ্রেণিতে রূপান্তর করব।
চেটে

1
@ মিঃহাট: পরিবর্তনীয় স্ট্রাক্ট সমস্ত ধরণের সমস্যা সৃষ্টি করে, কারণ তারা তাদের প্রত্যাশা মতো আচরণ করে না। এবং সর্বজনীন ক্ষেত্রগুলি encapsulation এর সম্পূর্ণ অভাব দেয়।
জন স্কিটি

@ জন স্কিটি পরিবর্তনীয় স্ট্রাক্টের অসুবিধাগুলি সম্পর্কে আপনি আরও সুনির্দিষ্ট হতে পারেন বা আমাকে পড়ার দিকে নির্দেশ করতে পারেন।
মিডহাট

2
@Midhat: কটাক্ষপাত আছে stackoverflow.com/questions/441309/why-are-mutable-structs-evil আদ্যস্থল জন্য।
জন স্কিটি

উত্তর:


228

বেনামে প্রকারের সাহায্যে আপনি আপনার কাঠামোর পরে শক্তভাবে টাইপ করা ডেটা স্ট্রাকচারে স্বেচ্ছাসেবী ক্ষেত্রগুলি নির্বাচন করতে পারবেন:

var cats = listObject
    .Select(i => new { i.category_id, i.category_name })
    .Distinct()
    .OrderByDescending(i => i.category_name)
    .ToArray();

যেহেতু আপনার (আপাতদৃষ্টিতে) এটি পরবর্তী ব্যবহারের জন্য সঞ্চয় করা দরকার, আপনি গ্রুপবাই অপারেটরটি ব্যবহার করতে পারেন:

Data[] cats = listObject
    .GroupBy(i => new { i.category_id, i.category_name })
    .OrderByDescending(g => g.Key.category_name)
    .Select(g => g.First())
    .ToArray();

আমি 1 টি কলামে স্বতন্ত্র ব্যবহার করতে এবং একাধিক কলাম পুনরুদ্ধার করতে চাই O তবে কীভাবে আমি এটি করতে পারি?
কিশান গজ্জর

1
আমি কখনও Selectনতুন ধরণের কথা ভাবি নি । আমার ক্ষেত্রে আমি একটি নতুন নির্বাচিত KeyValuePair
সিজেবার্থ

26
var selectedCategories =
    from value in
        (from data in listObject
        orderby data.category_name descending
        select new { ID = data.category_id, Name = data.category_name })
    group value by value.Name into g
    select g.First();

foreach (var category in selectedCategories) Console.WriteLine(category);

সম্পাদনা করুন : এটিকে আরও লিনকুই-ই বানিয়েছেন!


হাহাহা, ধন্যবাদ, ভাল, আমি সাহায্যের প্রশংসা করি। স্পষ্টতই এটি বিশ্বের সবচেয়ে কঠিন প্রশ্ন ছিল না।
Chet

@ আইআরবি আমাকে ক্ষমা করুন, ছোট প্রশ্ন। 'মান' ঠিক কী?
ফার্নান্দো এস ক্রোস

23

আপনি একটি বেনামি প্রকার ব্যবহার করতে পারেন:

.Select(i => new { i.name, i.category_name })

সংকলকটি একটি শ্রেণীর জন্য কোড nameএবং category_nameবৈশিষ্ট্য এবং সেই শ্রেণীর উদাহরণগুলি প্রদান করবে। আপনি নিজে নিজেও সম্পত্তির নাম নির্দিষ্ট করতে পারেন:

i => new { Id = i.category_id, Name = i.category_name }

আপনার কাছে নির্বিচারে সংখ্যক সম্পত্তি থাকতে পারে।


6

উপরে উল্লিখিত উদাহরণ অনুসারে আপনি লিনাক নির্বাচন করে একাধিক ক্ষেত্র নির্বাচন করতে পারেন এটি অনামিকার প্রকার হিসাবে ফিরে আসবে। আপনি যদি এই বেনামি প্রকারটি এড়াতে চান তবে এটি সহজ কৌশল।

var items = listObject.Select(f => new List<int>() { f.Item1, f.Item2 }).SelectMany(item => item).Distinct();

আমি মনে করি এটি আপনার সমস্যার সমাধান করে


5

এটি এমন কাজ যার জন্য বেনামে প্রকারগুলি খুব ভাল উপযোগী। আপনি কোনও প্রকারের বস্তুগুলি ফিরে আসতে পারেন যা সংকলক দ্বারা স্বয়ংক্রিয়ভাবে তৈরি করা হয়, ব্যবহার থেকে অনুমিত হয়।

বাক্য গঠনটি এই ফর্মটির:

new { Property1 = value1, Property2 = value2, ... }

আপনার ক্ষেত্রে, নিম্নলিখিত মত কিছু চেষ্টা করুন:

var listObject = getData();
var catNames = listObject.Select(i =>
    new { CatName = i.category_name, Item1 = i.item1, Item2 = i.item2 })
    .Distinct().OrderByDescending(s => s).ToArray();

4
var result = listObject.Select( i => new{ i.category_name, i.category_id } )

এটি বেনামে প্রকারগুলি ব্যবহার করে তাই আপনার অবশ্যই ভের কীওয়ার্ডটি আবশ্যক, যেহেতু এক্সপ্রেশনটির ফলস্বরূপ প্রকারটি আগে থেকেই জানা যায় না।



3

আপনি এটিকে একটি কীভ্যালিউপায়ার করতে পারেন, সুতরাং এটি আবার আসবে "IEnumerable<KeyValuePair<string, string>>"

সুতরাং, এটি এর মতো হবে:

.Select(i => new KeyValuePair<string, string>(i.category_id, i.category_name )).Distinct();

এটি কোনও সুবিধা ছাড়াই অযৌক্তিক জটিলতা যুক্ত করেছে
ম্যাজে মেরে

2
public class Student
{
    public string Name { set; get; }
    public int ID { set; get; }
}

class Program
{
  static void Main(string[] args)
    {
        Student[] students =
        {
        new Student { Name="zoyeb" , ID=1},
        new Student { Name="Siddiq" , ID=2},
        new Student { Name="sam" , ID=3},
        new Student { Name="james" , ID=4},
        new Student { Name="sonia" , ID=5}
        };

        var studentCollection = from s in students select new { s.ID , s.Name};

        foreach (var student in studentCollection)
        {
            Console.WriteLine(student.Name);
            Console.WriteLine(student.ID);
        }
    }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.