c# - 我如何获得特定的列表属性到数组
问题描述
我想获得列表类的属性。我如何通过不循环来获得价值?因为我希望列表成为一个数组。因为现在在第二种情况下它使用索引,有没有办法让它像第一种情况一样简单?
之前,我正在创建一个仅包含 1 个属性的列表并且它有效。此外,我想通过使用类/模型使它有点复杂。但是当我尝试按类使用时,它不能指望我的期望。
//Model
public class model
{
private string mCounter;
private string mName;
private string mEmail;
public model(string mCounter,string mName,string mEmail)
{
this.mCounter = mCounter;
this.mName = mName;
this.mEmail = mEmail;
}
public string get_Counter
{
get { return mCounter; }
}
public string get_Name
{
get { return mName; }
}
public string get_Email
{
get { return mEmail; }
}
}
//Example Data
DataTable dt = new DataTable();
dt.Columns.Add("counter", typeof(string));
dt.Columns.Add("name", typeof(string));
dt.Columns.Add("e-mail", typeof(string));
dt.Rows.Add("1", "David","David@gmail.com");
dt.Rows.Add("2", "Ben","Ben@gmail.com");
dt.Rows.Add("3", "Henry","Henry@gmail.com");
//case 1:Done (Worked well)
// List<string> Listcounter = new List<string>();
// for(int i = 0; i < dt.Rows.Count; i++)
// {
// Listcounter.Add(dt.Rows[i]["counter"].ToString());
// }
// //Result
// var result = string.Join("; ", Listcounter.ToArray());
// MessageBox.Show("e.g: " + result);
///////
//Case:2
/////List
List<model> listModel = new List<model>();
for (int i = 0; i < dt.Rows.Count; i++)
{
string counter = dt.Rows[i]["counter"].ToString();
string name = dt.Rows[i]["name"].ToString();
string email = dt.Rows[i]["e-mail"].ToString();
listModel.Add(new model(counter,name,email));
}
//Result
var result = string.Join("; ", listModel[0].get_Name.ToString() + listModel[0].get_Email.ToString());
MessageBox.Show("e.g: " + result);
///////
预期结果是:只在消息框中显示姓名和电子邮件
大卫 - David@gmail.com;本 - Ben@gmail.com; 亨利 - Henry@gmail.com
解决方案
在类中引入一个方法,该方法Model
将返回已格式化的字符串。然后,如果您不将公共吸气剂用于其他用途,则可以摆脱它们。
public class Model
{
private readonly string _counter;
private readonly string _name;
private readonly string _email;
public Mode(string counter, string name, string email)
{
_counter = counter;
_name = name;
_email = email;
}
public string FormattedData()
{
return $"{_counter}. {_name} - {_email}";
}
}
.Select
您可以通过使用扩展方法仅循环一次数据来构建整个字符串。
var models = dt.AsEnumerable()
.Select(row => new Model(
row.Field<string>("counter"),
row.Field<string>("name"),
row.Field<string>("e-mail")))
.Select(model => model.FormattedData());
var result = String.Join(", ", models);
Console.WriteLine(result);
// 1. David - David@gmail.com, 2. Ben - Ben@gmail.com, 3. Henry - Henry@gmail.com
正如@UniqIdentifierAssignedAtBirth 正确提到的那样,您不需要将集合转换为数组,只需将 enumerable 传递给String.Join
,它只会被枚举一次。
如果你ToString
在类中重写方法Model
,你的代码会变得更简单,因为泛型重载String.Join
接受任何类型的集合并调用.ToString()
每个项目。
public class Model
{
private readonly string _counter;
private readonly string _name;
private readonly string _email;
public Mode(string counter, string name, string email)
{
_counter = counter;
_name = name;
_email = email;
}
public override string ToString()
{
return $"{_counter}. {_name} - {_email}";
}
}
// Usage
var models = dt.AsEnumerable()
.Select(row => new Model(
row.Field<string>("counter"),
row.Field<string>("name"),
row.Field<string>("e-mail")));
var result = String.Join(", ", models);
Console.WriteLine(result);
// 1. David - David@gmail.com, 2. Ben - Ben@gmail.com, 3. Henry - Henry@gmail.com
推荐阅读
- excel - 有谁知道如何在 VBA 中关闭基于 ODATA (xlConnectionTypeModel) 的 PowerQuery 连接的后台刷新?
- java - 使用 JUnit/TestNG 作为列表传递套件中的参数变量
- javascript - 必须有一种方法可以程序化地生成这个数组
- c++ - 用于适配器的 c++ crtp:传递抛出临时返回值
- python - Python 如何将 2**500 表示为 int?
- javascript - 有没有办法编写一个具有一些通用逻辑的函数?
- c - 在 C 中声明/定义静态、外部和内联函数的常用方法
- python - Hugging Face 模型 Bio_ClinicalBERT 产生 404 错误
- ios -
在表 SymbolNameOverrides 中找不到 - javascript - 尝试使用条形图和差异线/值制作动态 D3 图表