我的应用程序使用这样的列表:
List<MyClass> list = new List<MyClass>();
使用
Add
方法,将 MyClass
的另一个实例添加到列表中。
MyClass
除其他外,还提供以下方法:
public void SetId(String Id);
public String GetId();
如何使用
MyClass
方法找到 GetId
的特定实例?我知道有Find
方法,但我不知道这在这里是否有效?!
使用 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 自动属性
public string Id { get; } = "A07"; // Evaluated once when object is initialized.
您还可以在构造函数中初始化仅 getter 属性。仅 getter 自动属性是 true 只读属性,与具有私有 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 开始,您可以使用
required
属性来强制客户端代码对其进行初始化。
field
关键字计划用于 C# 的未来版本(它没有进入 C# 11 和 C# 12,并允许访问自动创建的支持字段。
// 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.Select”正在选择符合您给定条件的数据。如果您理解有问题,请随时询问。