繁体   English   中英

我如何获得特定清单 <class> 数组属性

[英]How do i get specific List<class> property to array

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

之前,Iam创建了一个仅包含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正确提到的那样,您不需要将集合转换为数组,只需将枚举传递给String.Join ,该枚举将仅枚举一次。

如果在Model类中重写ToString方法,则代码会变得更加简单,因为String.Join泛型重载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
using System;
using System.Collections.Generic;
using System.Linq;

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 MCounter
    {
        get { return mCounter; }
    }

    public string MName
    {
        get { return mName; }
    }

    public string MEmail
    {
        get { return mEmail; }
    }

    # This method will output the results you need for each Model object.
    public override string ToString()
    {
        return MName + " <" + MEmail + ">";
    }

}

public class Program
{
    public static void Main()
    {
        List<Model> listModel = new List<Model>();
        listModel.Add(new Model("Counter 1", "Name 1", "email1@example.com"));
        listModel.Add(new Model("Counter 2", "Name 2", "email2@example.com"));

        string combined = string.Join( "; ", listModel.Select(c=>c.ToString()).ToArray<string>());
        Console.WriteLine(combined);
    }
}

仅供参考,C#代码约定: https : //docs.microsoft.com/zh-cn/dotnet/csharp/programming-guide/inside-a-program/coding-conventions

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM