c# - 如何在List <T>中找到特定元素?

我的应用程序使用这样的列表:

Add

使用Add方法,将另一个实例MyClass添加到列表中。

MyClass提供了以下方法:

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

如何通过使用GetId方法找到MyClass的特定实例? 我知道有Find方法,但我不知道这是否适用于此?!

Robert Strauch asked 2019-08-13T19:14:18Z
8个解决方案
215 votes

使用lambda表达式

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

注意:C#具有内置的属性语法。 写,而不是编写getter和setter方法(正如你可能习惯于Java)

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

x = y = z = 0是仅在set访问器中已知的上下文关键字。 它表示分配给该属性的值。

由于经常使用此模式,因此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; }

这使您可以在类中设置x = y = z = 0,但不能从外部设置。 如果您还需要在派生类中设置它,您也可以保护setter

public string Id { get; protected set; }

最后,您可以将属性声明为x = y = z = 0并在派生类中覆盖它们,从而允许您为getter和setter提供不同的实现; 就像普通的虚拟方法一样。


从C#6.0(Visual Studio 2015,Roslyn)开始,您可以使用内联初始化程序编写仅具有getter的自动属性

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

您也可以在构造函数中初始化仅限getter的属性。 与仅具有私有设置器的自动实现属性不同,仅限Getter的自动属性是真正的只读属性。

这也适用于读写自动属性:

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编译器平台(&#34; Roslyn&#34;)
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)),效果与语句x = 0; y = 0; z = 0;相同。

Olivier Jacot-Descombes answered 2019-08-13T19:16:28Z
18 votes
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();
zellio answered 2019-08-13T19:16:54Z
8 votes

尝试:

 list.Find(item => item.id==myid);
Amritpal Singh answered 2019-08-13T19:17:14Z
4 votes

您还可以使用LINQ扩展:

string id = "hello";
MyClass result = list.Where(m => m.GetId() == id).First();
Guffa answered 2019-08-13T19:17:39Z
4 votes

或者如果你不喜欢使用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
    }
}
Bjørn answered 2019-08-13T19:18:05Z
3 votes

您可以使用匿名方法语法编写的谓词最简洁地解决您的问题:

MyClass found = list.Find(item => item.GetID() == ID);
David Heffernan answered 2019-08-13T19:18:31Z
0 votes
public List<DealsCategory> DealCategory { get; set; }
int categoryid = Convert.ToInt16(dealsModel.DealCategory.Select(x => x.Id));
Muhammad Armaghan answered 2019-08-13T19:18:49Z
0 votes

您可以创建搜索变量来保存搜索条件。 这是使用数据库的示例。

 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

这里&#34; var query&#34; 正在生成您通过搜索变量提供的搜索条件。 然后&#34; DuePaymentstring.Select&#34; 正在选择符合您给定标准的数据。 如果您有理解问题,请随时询问。

Khandkar Asif Hossain answered 2019-08-13T19:19:23Z
translate from https://stackoverflow.com:/questions/9854917/how-can-i-find-a-specific-element-in-a-listt