c # конвертировать строку в 2 двойных - PullRequest
0 голосов
/ 11 января 2012

Я все еще довольно новичок в программировании на c #, поэтому я пытался создать метод класса. Но это не сработает.

Итак, что я хочу сделать: Я получаю строку с именем var. х и у число. Например, строка будет выглядеть так: "x02y42"

Итак, я хочу, чтобы внутри моего приложения была функция (окно wpf), где я мог бы отправить эту строку назад и получить 2 двойных числа, возвращаемых как: «double = 02» и «double = 42» (так, чтобы не было строк).

Итак, я сделал новый класс, и в этом классе я сделал этот код:

public double x,y(string parm)
{
    //input shall be: string s = x12y04;
    //inp s looks like x12y04

    //splut the string on the Y (so this tech should also work for x89232y329)
    //so this will create res[0] that is x89232 and an res[1] that is 329
    string[] res = parm.Split(new string[] { "y" }, StringSplitOptions.RemoveEmptyEntries);
    //now for the x in res[0], we replace it for a 0 so it are all numbers
    string resx = res[0].Replace("x", "0");

    //now we will get the strings to doubles so we can really start using them.
    double x = double.Parse(resx);
    double y = double.Parse(res[1]);

    //get the values back
    return x, y;

}

Теперь (ofc) это не сработало. Но, как указано выше, я все еще довольно плохо знаком с C #. Так что я тут делаю не так? Я могу поставить это в 1 функцию правильно? Чтобы в моем приложении я мог как-то это назвать?

Ответы [ 10 ]

3 голосов
/ 11 января 2012

Если вы действительно хотите использовать кортежи, используйте F #, а не C #. В C # вам придется использовать некоторый тип, представляющий кортеж; это может быть тип Point или тип Tuple<,>.

Изменение

public double x,y(string parm) 
...
return x, y;

до

public Point GetXY(string parm) 
...
return new Point(x, y);

или

public Tuple<double, double> GetXY(string parm) 
...
return Tuple.Create(x, y);
3 голосов
/ 11 января 2012

У вас должен быть фон в Python, я могу вывести из вашего кода.

В C # до 4.0 невозможно вернуть несколько значений (кортеж) в pythonic путь.Вам нужно вернуть массив или вернуть значения через out аргументы.(если вы не определите свой класс, представляющий кортеж).

В C # 4.0 вы можете вернуть Tuple<double, double>, как указано в комментариях.

1 голос
/ 11 января 2012

Вы должны вернуть массив, содержащий два значения.Например:

public double[] Convert(string parm)
{
    //input shall be: string s = x12y04;
    //inp s looks like x12y04

    //splut the string on the Y (so this tech should also work for x89232y329)
    //so this will create res[0] that is x89232 and an res[1] that is 329
    string[] res = parm.Split(new string[] { "y" }, StringSplitOptions.RemoveEmptyEntries);
    //now for the x in res[0], we replace it for a 0 so it are all numbers
    string resx = res[0].Replace("x", "0");

    //now we will get the strings to doubles so we can really start using them.
    double x = double.Parse(resx);
    double y = double.Parse(res[1]);

    //get the values back
    return new double[] { x, y };

}
0 голосов
/ 11 января 2012

Вы можете использовать выходные параметры, если вы действительно хотите иметь этот тип стиля.Однако я согласен с большинством других авторов в том, что ваши данные x / y должны быть возвращены как отдельный класс, содержащий данные x и y.

    static void Main(string[] args)
    {
        double x, y;

        parse("x12y04", out x, out y);

        //x and y now contain 12 and 4
    }

    static void parse(String parm, out double x, out double y)
    {
        string[] res = parm.Split(new string[] { "y" }, StringSplitOptions.RemoveEmptyEntries);
        string resx = res[0].Replace("x", "0");

        x = double.Parse(resx);
        y = double.Parse(res[1]);
    }
0 голосов
/ 11 января 2012

Прежде всего, «x, y» не является допустимым именем метода.Во-вторых, метод может вернуть только одну вещь.Ключ должен был бы возвратить объект, который представляет оба ваших значения.Что-то вроде System.Drawing.Point () или Tuple ().

Вот что должно работать для вас:

    public Tuple<double, double> GetXY(string parm)
    {
        Regex regex = new Regex(@"x(?<x>\d+)y(?<y>\d+)");

        Match match = regex.Match(parm);
        if (!match.Success)
            return new Tuple<double, double>(0, 0);

        double x, y;
        double.TryParse(match.Groups["x"].Value, out x);
        double.TryParse(match.Groups["y"].Value, out y);

        return new Tuple<double, double>(x, y);
    }

Вы можете проверить это, выполнив что-то вроде:

        Console.WriteLine(GetXY("x53y2384"));
0 голосов
/ 11 января 2012

Вы можете создать класс пары, как показано ниже -

    public class Pair<T, U> {
      public Pair() {
      }

      public Pair(T first, U second) {
        this.First = first;
        this.Second = second;
      }

     public T First { get; set; }
     public U Second { get; set; }
    };

, сделать тип возврата для объекта пары в вашем методе и вернуть новую пару (x, y);

0 голосов
/ 11 января 2012

Вот что я бы сделал ...

    static Tuple<Double, Double> ParseCoordinates(string parm)
    {
        string[] res = parm.Replace("x","")
                           .Replace("y",",")
                           .Split(",".ToCharArray());
        double x, y;
        double.TryParse(res[0], out x);
        double.TryParse(res[1], out y);

        return new Tuple<double, double>(x, y);

    }

если у вас нет доступа к c # 4 ...

    static bool ParseCoordinates(string parm, out double x, out double y)
    {
        string[] res = parm.Replace("x","")
                           .Replace("y",",")
                           .Split(",".ToCharArray());

        bool parseX = double.TryParse(res[0], out x);
        bool parseY = double.TryParse(res[1], out y);

        return parseX && parseY;

    }
0 голосов
/ 11 января 2012

Я немного упростил код:

// C# method names cannot contain character ,
public double[] Parse(string param)
{
    string[] res = param.Split(new string[] { "x",  "y" }, StringSplitOptions.RemoveEmptyEntries);

    double x = double.Parse(res[0]);
    double y = double.Parse(res[1]);

    //get the values back as array
    return new double[] { x, y };
}
0 голосов
/ 11 января 2012
    class Point
    {
        public Point(int x, int y) { this.x = x; this.y = y; }
        public double x { get; set; }
        public double y { get; set; }
    }

public Point ParseString(string parm)
{
    //input shall be: string s = x12y04;
    //inp s looks like x12y04

    //splut the string on the Y (so this tech should also work for x89232y329)
    //so this will create res[0] that is x89232 and an res[1] that is 329
    string[] res = parm.Split(new string[] { "y" }, StringSplitOptions.RemoveEmptyEntries);
    //now for the x in res[0], we replace it for a 0 so it are all numbers
    string resx = res[0].Replace("x", "0");

    //now we will get the strings to doubles so we can really start using them.
    double x = double.Parse(resx);
    double y = double.Parse(res[1]);

    //get the values back
    return new Point(x,y);

}
0 голосов
/ 11 января 2012

вы не можете вернуть 2 объекта из метода

вы должны вернуть массив типа double, кортеж или точку (я думаю, вы используете координаты)

в любом случае вместо string.splitпредпочтительно использовать indexof ("x") и "y", а затем подстроку, чтобы вы могли проверить переданную строку и избежать исключения indexoutofrange

    public double[] GetCoordinates(string inputValue)
    {
        string normalized = inputValue.ToLower();
        int indexX = normalized.IndexOf("x")+1;
        int indexY = normalized.IndexOf("y")+1;

        if (indexX == 0 || indexY == 0) 
        {
            throw new ArgumentException();
        }

        //if string is y45x22 i reverse them
        if (indexX > indexY) 
        {
            indexX ^= indexY;
            indexY ^= indexX;
            indexX ^= indexY;
        }
        string xstring = normalized.Substring(indexX, normalized.Length - indexY);
        string ystring = normalized.Substring(indexY, normalized.Length - indexY);

        double[] rtn = new double[2];

        if (!double.TryParse(xstring, out rtn[0]) || !double.TryParse(ystring, out rtn[1])) 
        {
            throw new ArgumentException();
        }
        return rtn;
    }
...