如何在 List < T > 中找到特定的元素?

我的应用程序使用如下列表:

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

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

除其他外,MyClass提供了以下方法:

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

如何通过使用 GetId方法找到 MyClass的特定实例?我知道有 Find方法,但我不知道这是否可以在这里工作? !

698132 次浏览

使用 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;
}
}

value是仅在 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; }

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

public string Id { get; protected set; }

最后,可以将属性声明为 virtual并在派生类中重写它们,从而允许为 getter 和 setter 提供不同的实现; 就像普通的虚方法一样。


自 C # 6.0(Visual Studio 2015,Roslyn)以来,您可以使用内联初始化器编写只有 getter 的 auto-properties

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

您还可以在构造函数中初始化 getter-only 属性。Getter-only 自动属性是 没错只读属性,与使用私有 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”)
< a href = “ https://github.com/dotnet/roslyn/wiki/New-Language-Features-in-C% 23-6”rel = “ nofollow noReferrer”> 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;相同的效果。

自 C # 9.0以来,您可以使用只读(或更好的 initialize-once)属性,这些属性可以在对象初始化器中进行初始化。这在目前只有 getter 属性的情况下是不可能的。

public string Name { get; init; }


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

从 C # 11开始,可以使用 required属性强制客户机代码初始化它。

field关键字是为 C # 的未来版本计划的(它没有进入 C # 11) ,并允许访问自动创建的后备字段。

// 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);

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

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

你也可以使用 LINQ扩展:

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

或者,如果你不喜欢使用 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
}
}
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”。“选择”是选择符合给定条件的数据。如果你有什么理解上的问题,尽管问。