首页 > 解决方案 > 我如何获得特定的列表属性到数组

问题描述

我想获得列表类的属性。我如何通过不循环来获得价值?因为我希望列表成为一个数组。因为现在在第二种情况下它使用索引,有没有办法让它像第一种情况一样简单?

之前,我正在创建一个仅包含 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

标签: c#

解决方案


在类中引入一个方法,该方法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

推荐阅读