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


114

আমার অ্যাপ্লিকেশনটি এই জাতীয় একটি তালিকা ব্যবহার করে:

List<MyClass> list = new List<MyClass>();

Addপদ্ধতিটি ব্যবহার করে , MyClassতালিকার সাথে আরও একটি উদাহরণ যুক্ত করা হয়েছে।

MyClass অন্যদের মধ্যে নিম্নলিখিত পদ্ধতিগুলি সরবরাহ করে:

public void SetId(String Id);
public String GetId();

পদ্ধতিটি MyClassব্যবহার করে কীভাবে আমি একটি নির্দিষ্ট উদাহরণ খুঁজে GetIdপাব? আমি জানি যে Findপদ্ধতি আছে, কিন্তু আমি জানি না এটি এখানে কাজ করবে কিনা ?!

উত্তর:


263

ল্যাম্বডা এক্সপ্রেশন ব্যবহার করুন

MyClass result = list.Find(x => x.GetId() == "xy");

দ্রষ্টব্য: সি # এর বৈশিষ্ট্যের জন্য একটি অন্তর্নির্মিত বাক্য গঠন রয়েছে। গেটর এবং সেটার পদ্ধতিগুলি লেখার পরিবর্তে (যেমন আপনি জাভা থেকে অভ্যস্ত হতে পারেন) লিখুন

private string _id;
public string Id
{
    get
    {
        return _id;
    }
    set
    {
        _id = value;
    }
}

valueএকটি প্রাসঙ্গিক কীওয়ার্ড যা কেবল সেট অ্যাকসেসরে পরিচিত। এটি সম্পত্তিতে নির্ধারিত মান উপস্থাপন করে।

যেহেতু এই প্যাটার্নটি প্রায়শই ব্যবহৃত হয়, সি # স্বয়ংক্রিয়-প্রয়োগকৃত বৈশিষ্ট্য সরবরাহ করে । এগুলি উপরের কোডটির একটি সংক্ষিপ্ত সংস্করণ; তবে, ব্যাকিং ভেরিয়েবলটি লুকানো এবং অ্যাক্সেসযোগ্য নয় (তবে এটি ভিবিতে ক্লাসের মধ্যে থেকে অ্যাক্সেসযোগ্য)।

public string Id { get; set; }

আপনি কেবল বৈশিষ্ট্যগুলি ব্যবহার করতে পারেন যেমন আপনি কোনও ক্ষেত্র অ্যাক্সেস করছেন:

var obj = new MyClass();
obj.Id = "xy";       // Calls the setter with "xy" assigned to the value parameter.
string id = obj.Id;  // Calls the getter.

বৈশিষ্ট্য ব্যবহার করে আপনি তালিকার আইটেমগুলি এর জন্য অনুসন্ধান করতে পারেন

MyClass result = list.Find(x => x.Id == "xy"); 

আপনার যদি কেবল পঠনযোগ্য সম্পত্তি প্রয়োজন হয় তবে আপনি স্বয়ংক্রিয়ভাবে প্রয়োগ করা বৈশিষ্ট্যগুলিও ব্যবহার করতে পারেন:

public string Id { get; private set; }

এটি আপনাকে Idক্লাসের মধ্যে সেট করতে সক্ষম করে তবে বাইরে থেকে নয়। আপনার যদি এটি উত্পন্ন ক্লাসে সেট করার প্রয়োজন হয় তবে আপনি সেটারও সুরক্ষা দিতে পারেন

public string Id { get; protected set; }

এবং পরিশেষে, আপনি সম্পত্তি হিসাবে ঘোষণা করতে পারেন virtualএবং সেগুলি ডেরাইভিং ক্লাসগুলিতে ওভাররাইড করতে পারেন , যাতে আপনাকে গেটার এবং সেটটারদের জন্য বিভিন্ন বাস্তবায়ন সরবরাহ করতে দেয়; যেমন সাধারণ ভার্চুয়াল পদ্ধতিতে।


সি # 6.0 (ভিজ্যুয়াল স্টুডিও 2015, রোজলিন) যেহেতু আপনি একটি ইনলাইন ইনিশিয়ালাইজারের সাহায্যে কেবল গেটর-অটো-বৈশিষ্ট্যগুলি লিখতে পারেন

public string Id { get; } = "A07"; // Evaluated once when object is initialized.

পরিবর্তে কনস্ট্রাক্টরের অভ্যন্তরে গেটর-কেবল বৈশিষ্ট্যগুলি শুরু করতে পারেন। কেবলমাত্র গেটর-অটো-বৈশিষ্ট্যগুলি কোনও ব্যক্তিগত সেটারের সাথে স্ব-বাস্তবায়িত বৈশিষ্ট্যগুলির বিপরীতে সত্য পঠনযোগ্য বৈশিষ্ট্য।

এটি রিড-রাইট অটো-প্রোপার্টিগুলির সাথেও কাজ করে:

public string Id { get; set; } = "A07";

সি # 6.0 দিয়ে শুরু করে আপনি প্রকাশ-দেহী সদস্য হিসাবেও বৈশিষ্ট্যগুলি লিখতে পারেন

public DateTime Yesterday => DateTime.Date.AddDays(-1); // Evaluated at each call.
// Instead of
public DateTime Yesterday { get { return DateTime.Date.AddDays(-1); } }

দেখুন:। নেট কম্পাইলার প্ল্যাটফর্ম ("রোজলিন")
         সি # 6 তে নতুন ভাষার বৈশিষ্ট্য

সি # 7.0 দিয়ে শুরু করে, গেটর এবং সেটার উভয়ই এক্সপ্রেশন বডি সহ লেখা যেতে পারে:

public string Name
{
    get => _name;                                // getter
    set => _name = value;                        // setter
}

নোট করুন যে এই ক্ষেত্রে সেটারটি অবশ্যই একটি এক্সপ্রেশন হবে। এটি বিবৃতি হতে পারে না। উপরের উদাহরণটি কাজ করে, কারণ সি # তে একটি অ্যাসাইনমেন্ট একটি অভিব্যক্তি বা বিবৃতি হিসাবে ব্যবহার করা যেতে পারে। একটি অ্যাসাইনমেন্ট এক্সপ্রেশনের মান হ'ল নির্ধারিত মান যেখানে অ্যাসাইনমেন্টটি নিজেই একটি পার্শ্ব প্রতিক্রিয়া হয়। এটি আপনাকে একবারে একাধিক ভেরিয়েবলের মান নির্ধারণ করতে দেয়: x = y = z = 0সমতুল্য x = (y = (z = 0))এবং স্টেটমেন্টগুলির মতো একই প্রভাব রাখে x = 0; y = 0; z = 0;

ভাষার পরবর্তী সংস্করণ, সি # 9.0, সম্ভবত ২০২০ সালের নভেম্বরে উপলভ্য, কেবলমাত্র পঠনযোগ্য (বা আরও একবারে ভাল করে একবারে) বৈশিষ্ট্যগুলি মঞ্জুরি দেবে যা আপনি কোনও অবজেক্ট ইনিশিয়ালাইজারে আরম্ভ করতে পারবেন। এটি বর্তমানে গেটর-কেবল বৈশিষ্ট্যগুলির সাথেই সম্ভব নয়।

public string Name { get; init; }

var c = new C { Name = "c-sharp" };

2
দুর্দান্ত উত্তর, ধন্যবাদ। ডিবি অপারেশনের জন্য এটি দেখতে এমন কিছু দেখাচ্ছে: IQueryable<T> result = db.Set<T>().Find(//just id here//).ToList();এটি ইতিমধ্যে জানতে পারে যে আপনি প্রাথমিক কী খুঁজছেন। শুধু তথ্যের জন্য।
মিঃ blond

আমি জানি এটি একটি পুরানো উত্তর, তবে আমি গেটটি আলাদা করে আলাদা পদ্ধতিতে সেট করব যাতে তুলনার সময় মানটি দুর্ঘটনাক্রমে সেট না হয়।
জোয়েল ট্রুগার

@ জোয়েলট্রেউগার: একটি তুলনা সম্পত্তিটি পড়ে এবং তাই কেবল প্রাপ্তিটিকে কল করে।
অলিভিয়ার জ্যাকট-ডেসকোম্বেস

এটি সত্য, তবে একটি দুর্ঘটনাজনিত কার্যভার সেটটারকে কল করবে এবং সম্পত্তিটি পরিবর্তন করবে। return object.property = valueবনাম দেখুনreturn object.property == value
জোয়েল ট্রুগার

পৃথক সেট পদ্ধতির দুর্ঘটনাক্রমে কল সম্পত্তিটিও সংশোধন করবে। পৃথক সেট পদ্ধতিগুলি কীভাবে সুরক্ষা উন্নত করতে পারে তা আমি দেখছি না।
অলিভিয়ার জ্যাকট-ডেসকোম্বেস

19
var list = new List<MyClass>();
var item = list.Find( x => x.GetId() == "TARGET_ID" );

বা যদি কেবল একটি থাকে এবং আপনি এটি প্রয়োগ করতে চান তবে এর মতো কিছু আপনার পছন্দসই SingleOrDefaultহতে পারে

var item = list.SingleOrDefault( x => x.GetId() == "TARGET" );

if ( item == null )
    throw new Exception();

আপনি যদি ব্যতিক্রম করতে চান তবে কেন আপনি সিঙ্গলঅর্ডার ব্যবহার করবেন, একক () ব্যবহার করুন
কোড নাম জ্যাক


6

বা আপনি যদি লিনকিউ ব্যবহার করতে পছন্দ না করেন তবে আপনি এটি পুরানো-স্কুল পদ্ধতিতে করতে পারেন:

List<MyClass> list = new List<MyClass>();
foreach (MyClass element in list)
{
    if (element.GetId() == "heres_where_you_put_what_you_are_looking_for")
    {

        break; // If you only want to find the first instance a break here would be best for your application
    }
}


3

বেনামে পদ্ধতি সিনট্যাক্স ব্যবহার করে আপনি একটি প্রিকেট লিখিত সাহায্যে আপনার সমস্যার সমাধান করতে পারেন:

MyClass found = list.Find(item => item.GetID() == ID);

0
public List<DealsCategory> DealCategory { get; set; }
int categoryid = Convert.ToInt16(dealsModel.DealCategory.Select(x => x.Id));

যদিও এই কোডটি প্রশ্নের উত্তর দিতে পারে, কীভাবে সমস্যাটি সমাধান করবেন এবং উদাহরণ বা রেফারেন্স হিসাবে কোডটি কীভাবে সরবরাহ করবেন তা আরও ভাল। কোড-কেবল উত্তরগুলি বিভ্রান্তিকর হতে পারে এবং প্রসঙ্গের অভাব হতে পারে।
রবার্ট কলম্বিয়া

0

আপনার অনুসন্ধানের মানদণ্ড ধরে রাখতে আপনি একটি অনুসন্ধানের পরিবর্তনশীল তৈরি করতে পারেন। এখানে ডাটাবেস ব্যবহার করে একটি উদাহরণ দেওয়া হল।

 var query = from o in this.mJDBDataset.Products 
             where o.ProductStatus == textBox1.Text || o.Karrot == textBox1.Text 
             || o.ProductDetails == textBox1.Text || o.DepositDate == textBox1.Text 
             || o.SellDate == textBox1.Text
             select o;

 dataGridView1.DataSource = query.ToList();

 //Search and Calculate
 search = textBox1.Text;
 cnn.Open();
 string query1 = string.Format("select * from Products where ProductStatus='"
               + search +"'");
 SqlDataAdapter da = new SqlDataAdapter(query1, cnn);
 DataSet ds = new DataSet();
 da.Fill(ds, "Products");
 SqlDataReader reader;
 reader = new SqlCommand(query1, cnn).ExecuteReader();

 List<double> DuePayment = new List<double>();

 if (reader.HasRows)
 {

  while (reader.Read())
  {

   foreach (DataRow row in ds.Tables["Products"].Rows)
   {

     DuePaymentstring.Add(row["DuePayment"].ToString());
     DuePayment = DuePaymentstring.Select(x => double.Parse(x)).ToList();

   }
  }

  tdp = 0;
  tdp = DuePayment.Sum();                        
  DuePaymentstring.Remove(Convert.ToString(DuePaymentstring.Count));
  DuePayment.Clear();
 }
 cnn.Close();
 label3.Text = Convert.ToString(tdp + " Due Payment Count: " + 
 DuePayment.Count + " Due Payment string Count: " + DuePaymentstring.Count);
 tdp = 0;
 //DuePaymentstring.RemoveRange(0,DuePaymentstring.Count);
 //DuePayment.RemoveRange(0, DuePayment.Count);
 //Search and Calculate

এখানে "var কোয়েরি" অনুসন্ধান সন্ধানের মাধ্যমে আপনি যে সন্ধানের মানটি দিচ্ছেন তা তৈরি করছে। তারপরে "ডিউ পেমেন্টসট্রিং.সलेक्ट" আপনার প্রদত্ত মানদণ্ডের সাথে মিলিয়ে ডেটা নির্বাচন করছে। আপনার যদি বুঝতে সমস্যা হয় তবে নির্দ্বিধায় জিজ্ঞাসা করুন।

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