【问题标题】:Array to List<t> c#数组到列表<t> c#
【发布时间】:2018-04-09 22:02:29
【问题描述】:

我当前的代码有效并且输出正确。我正在从 data.txt 文件中提取数据,并已成功使用 TextFieldParser 将数据提取到数组中。有没有办法将我的代码转换为列表?怎么会这样?如果转换不是一种选择,那么关于从哪里开始代码的任何建议?基本上试图从一个数组到一个列表集合。

public partial class EmployeeInfoGeneratorForm : Form
{
    public EmployeeInfoGeneratorForm()
    {
        InitializeComponent();
    }

    // button event handler
    private void GenerateButton_Click(object sender, EventArgs e)
    {
        string[] parts;

        if(File.Exists("..\\data.txt"))
        {
            TextFieldParser parser = new TextFieldParser("..\\data.txt");

            parser.Delimiters = new string[] { "," };
            while (true)
            {
                parts = parser.ReadFields();
                if (parts == null)
                {
                    break;
                }
                this.nameheadtxt.Text = parts[0];
                this.addressheadtxt.Text = parts[1];
                this.ageheadtxt.Text = parts[2];
                this.payheadtxt.Text = parts[3];
                this.idheadtxt.Text = parts[4];
                this.devtypeheadtxt.Text = parts[5];
                this.taxheadtxt.Text = parts[6];

                this.emp1nametxt.Text = parts[7];
                this.emp1addresstxt.Text = parts[8];
                this.emp1agetxt.Text = parts[9];
                this.emp1paytxt.Text = parts[10];
                this.emp1idtxt.Text = parts[11];
                this.emp1typetxt.Text = parts[12];
                this.emp1taxtxt.Text = parts[13];

                this.emp2nametxt.Text = parts[14];
                this.emp2addresstxt.Text = parts[15];
                this.emp2agetxt.Text = parts[16];
                this.emp2paytxt.Text = parts[17];
                this.emp2idtxt.Text = parts[18];
                this.emp2typetxt.Text = parts[19];
                this.emp2taxtxt.Text = parts[20];

                this.emp3nametxt.Text = parts[21];
                this.emp3addresstxt.Text = parts[22];
                this.emp3agetxt.Text = parts[23];
                this.emp3paytxt.Text = parts[24];
                this.emp3idtxt.Text = parts[25];
                this.emp3typetxt.Text = parts[26];
                this.emp3taxtxt.Text = parts[27];

            }

        } 
        else //Error Message for if File isn't found
        {
            lblError.Text = "File Not Found";
        }
    }
}

【问题讨论】:

  • var list = parts.ToList() - 它内置在 System.Linq - ToList&lt;T&gt;
  • 为什么要转换成列表?如果内部实现适用于数组,我认为没有理由更改它,
  • 学习 c# 并开始了解有关 Collection 列表的更多信息。试验这个项目。我知道它可以作为一个数组工作,但我只是想了解更多关于集合的信息。我对编程和 c# 非常熟悉和新手。我的代码中可能有一些不好的做法,但我真的试图掌握如何将它从数组转换为集合列表。
  • while(!parser.EndOfData)代替while(true)
  • 使用字段更新这些 UI 控件是没有意义的,您只能看到文件中的最后一条记录。而是声明一个可以存储这些值的类,然后您可以声明 List(Of ThatClass)。在循环中使用它的 Add() 方法。如果您还想查看内容,请考虑使用 DataGridView。

标签: c# arrays visual-studio list


【解决方案1】:

在您的代码示例中有两个数组。

第一个例子

parser.Delimiters = new string[] { "," };

由于parserTextFieldParser,我可以看到Delimiters 必须设置为字符串数组。所以你不能改变它。

第二个例子

string[] parts;
parts = parser.ReadFields();

这个数组接受parser.ReadFields() 的结果。该函数的输出是一个字符串数组,因此不能在不中断调用的情况下更改此代码。

但是,您可以在之后立即将其转换为列表:

var parts = parser.ReadFields().ToList();

这也没什么意义。

当数组/列表的大小在创建后不会改变时,数组与列表一样好。将其放入列表只会增加开销。

【讨论】:

  • 在这种情况下,您必须将数组传递给Delimiters
  • 感谢大家迄今为止的提示!我认为如果我想将它放在集合列表中,最好不要在那里放置数组。但现在只是想弄清楚如何从 .t​​xt 文件中提取数据,然后显示到更多的窗口形式。在这项任务中,任何帮助都会很棒,但我会在网上寻找一些好的教程。
【解决方案2】:

这里有很多问题。我倾向于这样写你的代码:

public static IEnumerable<List<string>> ParseFields(string file)
{
  // Use "using" to clean up the parser.
  using (var parser = new TextFieldParser(file))
  {
    parser.Delimiters = new string[] { "," };
    // Use end-of-data, not checks for null.
    while (!parser.EndOfData)
      yield return parser.ReadFields().ToList();
  }
}

我会重构您的代码以将 UI 更新放在一种方法中:

private void UpdateText(List<string> parts ) { ... }

你只对序列中的 last 元素做一些事情;您之前的所有编辑都将丢失。所以要明确一点:

private void GenerateButton_Click(object sender, EventArgs e)
{
  // Use a named constant for constant strings used in several places
  const string data = "..\\data.txt";
  if(!File.Exists(data))
  {
    lblError.Text = "File Not Found";
  } else {
    var parts = ParseFields(data).LastOrDefault();
    if (parts != null) 
      UpdateText(parts);
  }
}

看看当你把它分解成更小的部分时,这个逻辑看起来有多清晰?拥有可以轻松放入页面的方法非常令人愉快。

【讨论】:

  • 抱歉,Eric 可能是个愚蠢的问题(但谢谢你,因为其中一些原因)。我喜欢您在这里向我展示的内容,但我很新,现在很难根据您的建议进行编辑。我可能缺少一些基本的东西。有什么方法可以显示我的代码在哪里以及哪些代码被您的建议替换了?
【解决方案3】:

直接回答您的问题:

使用带有IEnumerable&lt;T&gt; 参数的List&lt;T&gt; 构造函数。

话虽如此,我会阅读 Lippert 先生的回答,直到您完全理解为止。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-20
    相关资源
    最近更新 更多