C# «объект» не содержит определения «разделить» - PullRequest
2 голосов
/ 22 марта 2020

В таблице MySQL Мне нужно проверить это условие, используя C# в качестве pnet в DataSet:

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# «объект» не содержит определения для «Разделить ”

Моя таблица ниже и столбцы A, B и C устанавливаются как десятичное значение 10,2.

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

Как решить эту проблему?

Пожалуйста, вы можете мне помочь?

Редактировать # 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();
        }
    }
}

Это строки ошибки:

enter image description here

Ошибка:

Наилучшее перегруженное соответствие метода для 'string.Join (string, string [])' имеет недопустимые аргументы

Редактировать # 03

Ошибка:

Наилучшее совпадение перегруженного метода для 'string.Join (string, string [])' имеет недопустимые аргументы

Код

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 />");
}

Edit # 02 Это моя таблица (первые 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 />");
        }
    }
}

Edit # 01

Я не могу напечатать значение ...

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

Ответы [ 3 ]

1 голос
/ 22 марта 2020

Вам необходимо изменить код для преобразования в строку, затем проанализировать строку как double, затем преобразовать в массив.

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 не делает что-то еще).

Кроме того, в вашем l oop в редактировании вы всегда получаете только первый ряд:

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();
        }
    }
}

Что для меня дает желаемый результат. Я думаю, что ошибка, которую вы видите, может быть в другом месте вашего приложения.

1 голос
/ 23 марта 2020

Неверный тип входного параметра.

Пожалуйста, в вашей строке замените '' на ""

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 />");
1 голос
/ 22 марта 2020

Попробуйте добавить .ToString () перед .Split (). Возможно, вам также понадобится приведение к удвоению.

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