【问题标题】:C#: Checking That ArrayList Elements have specific typeC#:检查 ArrayList 元素是否具有特定类型
【发布时间】:2011-10-06 03:44:43
【问题描述】:
               ArrayList fileList = new ArrayList();


      private void button2_Click(object sender, EventArgs e)
            {
          if (openFileDialog1.ShowDialog() == DialogResult.OK)
            {
            string line;

            // Read the file and display it line by line.
            System.IO.StreamReader file = new System.IO.StreamReader(openFileDialog1.FileName);
            while ((line = file.ReadLine()) != null)
            {
                // Puts elements in table
                fileList.Add(line.Split(';'));
            }

            file.Close();
        }

        for (int i = 0; i < fileList.Count; i++)
        {
            for (int x = 0; x < (fileList[i] as string[]).Length; x++)
            {
               // if (x ==0)
              //  { 
                    //fileList[0] must Be int 
              //  }
               // if (x==1)
                    //fileList[1] must be string 

                this.textBox2.Text += ((fileList[i] as string[])[x] + " ");
            }

            this.textBox2.Text += Environment.NewLine;
        }
    }

我到这里为止。

我从 CSV 文件中获取元素。

我现在需要确保 1 只有数字整数 (1,2,3,4,5),第二个 只有名称(因此它将具有字符串或字符类型),第三个姓氏等。

行显示如下:1;George;Mano;

如何确定 CSV 文件的类型正确?

我认为有关此问题的更多代码将放在 2 for 语句中。

非常感谢,

乔治。

【问题讨论】:

  • 您的帖子表明您的行类似于1;2;3;johnson;smith;gowerjohn;james;susan。这是正确的,还是他们是这样的:1;johnson;john2;smith;james3;gower;susan
  • 你没有问这个,所以我只是发表评论。为什么要重新发明轮子?有几个开源 csv 库。我使用 linq2csv,您可以将其与 DataAnnotation 属性一起使用以进行验证。看到这个链接stackoverflow.com/questions/1405038/reading-csv-files-in-net
  • @Agent-j - 我相信他最初的问题是说第一列(第一个值)是一个整数。

标签: c# csv arraylist validation


【解决方案1】:

您可以使用Regex 类。

【讨论】:

  • -1:无用且信息量少的答案。例如在这种情况下,用户将如何使用正则表达式?
  • @Binary - 这个问题本身也不是最好的。
  • 一个低质量的问题不是低质量答案的借口。你有很多其他的选择,只有一些是为了澄清问题、否决问题或不理会问题。 Stack Overflow 是专门为 Make the Internet a better place 创建的,这里的每个答案都应该符合这个理想,这也是 sarcasm 和 let-me-google-that-for-you 答案很快被放下的原因之一。这个答案实际上对提问者没有任何帮助。
  • @Binary Worrier - 我们必须同意我们有不同的思维方式。我认为告诉作者使用正则表达式是一个有效的陈述。我同意treetey的回答没有澄清。
  • @Ramhound:显然是的,我们的想法确实不同,但是这种特殊的思维方式通常不符合 Stack Exchange 网站上的最佳实践,尤其是 Stack Overflow 上的最佳实践。
【解决方案2】:

fileList[0] 必须是 int:

int x;

if(int.TryParse(fileList[0], out x)){ //do whatever here and x will have that integer value. TryParse will return false if it's not an integer so the if will not fire}

fileList[1] 必须是字符串:

遍历字符串并检查每个元素是一个字母。查看char. 方法以找到合适的方法。

【讨论】:

    【解决方案3】:

    编辑:现在我们知道它确实是 CSV,这是一个柱状答案 ;-)

    您的ArrayList 包含string[],因此您需要验证每个数组是否具有适当的字符串类型。

    for (int i = 0; i < fileList.Count; i++)
    {
       string[] lineItems = (string[])fileList[i];
       if (!Regex.IsMatch (lineItems[0], "^\d+$")) // numbers
          throw new ArgumentException ("invalid id at row " + i);
       if (!Regex.IsMatch (lineItems[1], "^[a-zA-Z]+$")) // surnames - letters-only
          throw new ArgumentException ("invalid surname at row " + i);
       if (!Regex.IsMatch (lineItems[2], "^[a-zA-Z]+$")) // names - letters-only
          throw new ArgumentException ("invalid name at row " + i);
    }
    

    【讨论】:

    • @Ramhound,这不是真的。如果这是通用的,那将是List&lt;string[]&gt;。请注意 OP 如何处理 fileList.Add (string.split...),而不是 fileList.AddRange(string.split(...))
    • 我从来没有说过这是一个通用的集合。虽然再次查看代码,但我注意到我错过了返回 String[] 的 Split 语句。
    • @Ramhound,我只是想描述 ArrayList 的内容,我并不是要暗示你错过了该类型的通用性。 :-) 我为误解表示歉意。
    • 我明白了。感谢您的澄清,因为我在最初的回复中错过了 String.Split。
    • string[] lineItems = (string[])fileList[i]; 行是做什么的?我已经定义了一个我的 ArrayList ArrayList fileList = new ArrayList();
    【解决方案4】:

    我认为您的问题需要更多工作。

    您没有出示您对filelist 的声明。不管它是什么,没有理由将其转换为string[] 只是为了获得长度。不管是什么类型的长度都是一样的。您不能使用此方法来确定哪些项目是字符串。

    您需要遍历项目并查看它们是否仅包含数字或其他内容。

    另外,您读取 CSV 文件的代码引用不正确。 CSV 文件以逗号分隔。它们可能在双引号中包含逗号。这些逗号应该被忽略。更好的读取 CSV 文件的方法可以看here

    【讨论】:

    • 查看对代码所做的编辑。我的 CSV 文件用 ; 分隔
    • @george:如果用;分隔,则不是CSV。
    • @Jonathan - 它仍然是一个单独的值,有人可能会争辩说,任何未出现在数据中的符号(除非它在引号内)都可能是分隔该值的字符。
    • @Ramhound:CSV 代表 逗号分隔值
    • @Jonathan Wood - 我并不反对它的实际含义。当你可以让 Excel 加载 CSV 并让它几乎使用任何字符作为分隔符时,要说他的文件不是 CSV,而我什至不明白你提出它的原因。 en.wikipedia.org/wiki/Comma-separated_values(德语和荷兰语使用 ; 作为分隔符)。
    【解决方案5】:

    Arraylist 包含对象。

    System.IO.StreamReader.ReadLine 返回一个字符串

    检查读取的第一行的值并尝试将字符串转换为整数是一种有效的方法。

    您当前的方法是将 System.IO.StreamReader.ReadLine 返回的字符串添加到您的集合中,稍后您可以使用 String.Split 方法将其转换为 String[]。 p>

    您的其他要求将更加困难,因为您正在阅读的每一行都已经是一个字符串。因此,您必须查看字符串中的每个字符以确定它是否是名称。

    换句话说,您可能希望找到一种不同的方式来提供输入。我同意正则表达式可能是摆脱垃圾数据的最佳方式。

    【讨论】:

    猜你喜欢
    • 2012-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-25
    • 2023-02-16
    • 2020-06-18
    • 2011-12-12
    相关资源
    最近更新 更多