C# 'object' 不包含“拆分”的定义

C# 'object' does not contain a definition for “Split”

在 MySQL table 中,我需要在 DataSet 上的 aspnet 中使用 C# 检查此条件:

if (A < 0.1 && B > 1 && (C >= 1 && C <= 4))

当所有条件都为真时,我需要在 aspx 页面上打印该值。

我试过这段代码没有成功:

Double[] A = dt.Rows[0]["A"].Split(',');
Double[] B = dt.Rows[0]["B"].Split(',');
Double[] C = dt.Rows[0]["C"].Split(',');

long AC = A.Where(x => x < 0.1).Count();
long BC = B.Where(x => x > 1).Count();
long CC = C.Where(x => x >= 1 && x <= 4).Count();

if((AC == 1) && (BC == 1) && (CC == 1)
{
    //Print
}

但错误是:

C# 'object' does not contain a definition for “Split”

我下面的 table 和 A、B 和 C 列设置为十进制 10,2 值。

+---+-------+------+
| A | B     | C    |
+---+-------+------+
| 0 | 16,11 | 3,08 |
+---+-------+------+

我该如何解决这个问题?

编辑#01

我无法打印值...

Double[] A = dt.Rows[0]["A"].ToString().Split(',').Select(double.Parse).ToArray(); 
string str = A.ToString();  
Response.Write(str);

编辑 #02

这是我的 table(前 10 行):

+------+------+------+
| A    | B    | C    |
+------+------+------+
| 0,59 | 1,54 | 1    |
| 6,77 | 0,13 | 1,3  |
| 1    | 1,26 | 1    |
| 0,67 | 0,18 | 1,5  |
| 1    | 0,13 | 0,1  |
| 1    | 0,38 | 0,08 |
| 0,5  | 0,17 | 4    |
| 6,73 | 0,29 | 15   |
| 0    | 16,1 | 3,8  |
| 0,13 | 0,8  | 8    |
+------+------+------+

我期待这样的打印结果:

A >>> 0,59 6,77 1 0,67 1 1 0,5 6,73 0 0,13

B >>> 1,54 0,13 1,26 ...

C >>> 1 1,3 1 ...

但是在输出中我有:

A >>> 1 0

B >>> 1 0

C >>> 1 0

我使用你对这段代码的建议:

if (ds.Tables.Count > 0)
{
    dt = ds.Tables[0];

    foreach (DataTable table in ds.Tables)
    {
        foreach (DataRow row in table.Rows)
        {
            Double[] A = dt.Rows[0]["A"].ToString().Split(',').Select(double.Parse).ToArray();
            Double[] B = dt.Rows[0]["B"].ToString().Split(',').Select(double.Parse).ToArray();
            Double[] C = dt.Rows[0]["C"].ToString().Split(',').Select(double.Parse).ToArray();

            Response.Write("A >>> " + String.Join(" ", A.Select(a => a.ToString()).ToArray()) + "<br /><br />");

            Response.Write("B >>> " + String.Join(" ", B.Select(b => b.ToString()).ToArray()) + "<br /><br />");

            Response.Write("C >>> " + String.Join(" ", C.Select(c => c.ToString()).ToArray()) + "<br /><br />");
        }
    }
}

编辑#03

错误:

The best overloaded method match for 'string.Join(string, string[])' has some invalid arguments

代码

if (ds.Tables.Count > 0)
{
    dt = ds.Tables[0];

    var rows = dt.Rows.OfType<DataRow>().ToArray();

    Response.Write("A >>> " + string.Join(' ', rows.Select(a => a[0].ToString())) + "<br /><br />");
    Response.Write("B >>> " + string.Join(' ', rows.Select(b => b[1].ToString())) + "<br /><br />");
    Response.Write("C >>> " + string.Join(' ', rows.Select(c => c[2].ToString())) + "<br /><br />");
}

编辑#04

using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication2
{
    class Program
    {
        static void Main(string[] args)
        {
            DataSet ds = new DataSet("Test");

            DataTable table = ds.Tables.Add("TestTable");
            table.Columns.Add("A");
            table.Columns.Add("B");
            table.Columns.Add("C");
            DataRow dr = table.NewRow();
            dr["A"] = "0,59";
            dr["B"] = "1,54";
            dr["C"] = "1";
            table.Rows.Add(dr);
            DataRow dr2 = table.NewRow();
            dr2["A"] = "6,77";
            dr2["B"] = "0,13";
            dr2["C"] = "1,3";
            table.Rows.Add(dr2);

            DataTable dt = null;

            if (ds.Tables.Count > 0)
            {
                dt = ds.Tables[0];

                var rows = table.Rows.OfType<DataRow>().ToArray();

                string A = ("A >>> " + string.Join(' ', rows.Select(a => a[0].ToString())) + "<br /><br />");
                string B = ("B >>> " + string.Join(' ', rows.Select(b => b[1].ToString())) + "<br /><br />");
                string C = ("C >>> " + string.Join(' ', rows.Select(c => c[2].ToString())) + "<br /><br />");

                Console.WriteLine(A);
                Console.WriteLine(B);
                Console.WriteLine(C);
            }

            Console.ReadKey();
        }
    }
}

这些是错误行:

错误:

The best overloaded method match for 'string.Join(string, string[])' has some invalid arguments

尝试在 .Split() 之前添加 .ToString()。您可能还需要演员才能翻倍。

(double)dt.Rows[0]["A"].ToString().Split(',')

您需要将代码更改为转换为字符串,然后将字符串解析为双精度,然后转换为数组。

using System.Linq;
...    

Double[] A = dt.Rows[0]["A"].ToString().Split(',').Select(double.Parse).ToArray();
Double[] B = dt.Rows[0]["B"].ToString().Split(',').Select(double.Parse).ToArray();
Double[] C = dt.Rows[0]["C"].ToString().Split(',').Select(double.Parse).ToArray();

编辑

看到您的编辑后,要获得您想要的输出,您需要做的就是:

if (ds.Tables.Count > 0)
{
    dt = ds.Tables[0];

    var rows = dt.Rows.OfType<DataRow>().ToArray();

    Response.Write("A >>> " + string.Join(' ', rows.Select(a => a[0].ToString())) + "<br /><br />");
    Response.Write("B >>> " + string.Join(' ', rows.Select(b => b[1].ToString())) + "<br /><br />");
    Response.Write("C >>> " + string.Join(' ', rows.Select(c => c[2].ToString())) + "<br /><br />");
}

我已经测试过,并提供了所需的输出(除非 Response.Write 方法执行其他操作)。

此外,在编辑循环中,您只会得到第一行:

foreach (DataRow row in table.Rows)
{
    Double[] A = dt.Rows[0]["A"].ToString().Split(',').Select(double.Parse).ToArray();
    Double[] B = dt.Rows[0]["B"].ToString().Split(',').Select(double.Parse).ToArray();
    Double[] C = dt.Rows[0]["C"].ToString().Split(',').Select(double.Parse).ToArray();
    ...
}

应该是:

foreach (DataRow row in table.Rows)
{
    Double[] A = row["A"].ToString().Split(',').Select(double.Parse).ToArray();
    Double[] B = row["B"].ToString().Split(',').Select(double.Parse).ToArray();
    Double[] C = row["C"].ToString().Split(',').Select(double.Parse).ToArray();
    ...
}

编辑2修复了复制粘贴失败的问题。

编辑 3

这是我使用的测试代码:

using System;
using System.Data;
using System.Linq;

namespace ConsoleApp
{
    class Program
    {
        static void Main(string[] args)
        {
            DataSet ds = new DataSet("Test");

            DataTable table = ds.Tables.Add("TestTable");
            table.Columns.Add("A");
            table.Columns.Add("B");
            table.Columns.Add("C");
            DataRow dr = table.NewRow();
            dr["A"] = "0,59";
            dr["B"] = "1,54";
            dr["C"] = "1";
            table.Rows.Add(dr);
            DataRow dr2 = table.NewRow();
            dr2["A"] = "6,77";
            dr2["B"] = "0,13";
            dr2["C"] = "1,3";
            table.Rows.Add(dr2);

            DataTable dt = null;

            if (ds.Tables.Count > 0)
            {
                dt = ds.Tables[0];

                var rows = table.Rows.OfType<DataRow>().ToArray();

                string A = ("A >>> " + string.Join(' ', rows.Select(a => a[0].ToString())) + "<br /><br />");
                string B = ("B >>> " + string.Join(' ', rows.Select(b => b[1].ToString())) + "<br /><br />");
                string C = ("C >>> " + string.Join(' ', rows.Select(c => c[2].ToString())) + "<br /><br />");

                Console.WriteLine(A);
                Console.WriteLine(B);
                Console.WriteLine(C);
            }

            Console.ReadKey();
        }
    }
}

这对我来说提供了所需的输出。我认为您看到的错误可能出现在您应用程序的不同位置。

输入参数类型无效。

请将您的字符串中的 ' ' 替换为 " "

string A = ("A >>> " + string.Join(" ", rows.Select(a => a[0].ToString())) + "<br /><br />");
string B = ("B >>> " + string.Join(" ", rows.Select(b => b[1].ToString())) + "<br /><br />");
string C = ("C >>> " + string.Join(" ", rows.Select(c => c[2].ToString())) + "<br /><br />");