programing

목록에서 특정 요소를 찾으려면 어떻게 해야 합니까?

mbctv 2023. 4. 16. 15:37
반응형

목록에서 특정 요소를 찾으려면 어떻게 해야 합니까?

응용 프로그램에서는 다음과 같은 목록을 사용합니다.

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

사용방법Add메서드, 다른 인스턴스MyClass목록에 추가됩니다.

MyClass에는 특히 다음 방법이 있습니다.

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

의 특정 인스턴스를 찾으려면 어떻게 해야 합니까?MyClass를 사용하여GetId방법?거기 있는 거 알아Find방법이 있는데 이게 효과가 있을지 모르겠네요?!

람다 표현식 사용

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

주의: C#에는 속성에 대한 구문이 포함되어 있습니다.getter와 setter를 일반적인 방법(Java에서 익숙한 방법)으로 쓰는 대신,

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

value는 set accessor에서만 인식되는 컨텍스트 키워드입니다.속성에 할당된 값을 나타냅니다.

이 패턴은 자주 사용되므로 C#은 자동 구현 속성을 제공합니다.위의 코드의 짧은 버전이지만, 백업 변수는 숨겨져 액세스 할 수 없습니다(단, VB의 클래스 내에서 액세스 할 수 있습니다).

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파생 클래스로 덮어쓰기하면 일반적인 가상 메서드와 마찬가지로 getter와 setter에 대해 다른 구현을 제공할 수 있습니다.


C# 6.0(Visual Studio 2015, Roslyn) 이후 인라인 이니셜라이저로 getter 전용 자동 속성을 작성할 수 있습니다.

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

대신 생성자 내에서 getter 전용 속성을 초기화할 수도 있습니다.getter-only auto-properties는 private setter를 사용한 자동 구현 속성과는 달리 진정한 읽기 전용 속성입니다.

이것은, 다음의 읽기/쓰기 자동 속성에서도 동작합니다.

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

C# 6.0부터는 속성을 표현체 멤버로 쓸 수도 있습니다.

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

참조: .NET 컴파일러 플랫폼 ('Roslyn')
         C#6의 새로운 언어 기능

C# 7.0부터는 getter와 setter를 모두 식 본문으로 쓸 수 있습니다.

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

이 경우 setter는 식이어야 합니다.문장이 될 수 없습니다.위의 예는 C#에서는 할당이 식 또는 문으로 사용될 수 있기 때문에 기능합니다.할당식의 값은 할당된 값이며 할당 자체가 부작용입니다.이를 통해 한 번에 여러 변수에 값을 할당할 수 있습니다.x = y = z = 0 x = (y = (z = 0)) 이 있습니다.z = 0; y = 0; x = 0;.

C# 9.0 에서는 오브젝트인테셜라이저로 초기화할 수 있는 읽기 전용(또는 초기화를 한 번 실시하는 것이 좋습니다) 속성을 사용할 수 있습니다.현재 getter 전용 속성에서는 이 작업을 수행할 수 없습니다.

public string Name { get; init; }

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

부터는 C# 11 、 C# 11 、 C# 11 、required속성을 지정하여 클라이언트 코드를 강제로 초기화합니다.

field키워드는 C#의 미래 버전에서 계획되어 있으며(C# 11에는 포함되지 않음), 자동으로 생성된 backing 필드에 액세스할 수 있습니다.

// Removes time part in setter
public DateTime HiredDate { get; init => field = value.Date(); }

public Data LazyData => field ??= new Data();
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();

시험:

 list.Find(item => item.id==myid);

LINQ를 사용하고 싶지 않은 경우는, 종래의 방법으로 할 수 있습니다.

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
    }
}

LINQ 확장도 사용할 수 있습니다.

string id = "hello";
MyClass result = list.Where(m => m.GetId() == id).First();

익명 메서드 구문을 사용하여 기술된 술어를 사용하면 문제를 가장 간결하게 해결할 수 있습니다.

MyClass found = list.Find(item => item.GetID() == ID);
public List<DealsCategory> DealCategory { get; set; }
int categoryid = Convert.ToInt16(dealsModel.DealCategory.Select(x => x.Id));

검색 기준을 유지할 검색 변수를 만들 수 있습니다.다음은 데이터베이스를 사용하는 예입니다.

 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 query"는 검색 변수를 통해 제공하는 검색 기준을 생성합니다.그리고 "DuePaymentstring.선택"은 지정된 기준과 일치하는 데이터를 선택하는 것입니다.이해가 안 되면 언제든지 물어보세요.

언급URL : https://stackoverflow.com/questions/9854917/how-can-i-find-a-specific-element-in-a-listt

반응형