Подтвердить что ты не робот

Как вернуть 2 значения из одной функции

У меня есть функция, которая вычисляет два местоположения, и я хочу получить их оба, есть ли способ получить два значения, возвращенные из одной и той же функции, без превращения их в массив. я думаю что-то с аргументом или что-то вроде этого... tnx. здесь мой код:

public static int Location(int p_1, int p_2, int p_3, int p_4)
{
  int  XLocation = p_2 - p_1;
  int YLocation = p_4-p_3;
  return XLocation,YLocation;
}

public void Print()
{
}
4b9b3361

Ответ 1

Для этого существует несколько способов:

1) Использование:

public KeyValuePair<int, int> Location(int p_1, int p_2, int p_3, int p_4)
{                 
    return new KeyValuePair<int,int>(p_2 - p_1, p_4-p_3);
}

или

static Tuple<int, int> Location(int p_1, int p_2, int p_3, int p_4)
{
    return new Tuple<int, int>(p_2 - p_1, p_4-p_3);
}

2) Используйте собственный класс, например Point

public class Point
{
    public int XLocation { get; set; }
    public int YLocation { get; set; }
}

public static Point Location(int p_1, int p_2, int p_3, int p_4) 
{    
     return new Point 
     {
        XLocation  = p_2 - p_1;
        YLocation = p_4 - p_3;
     }      
 }

3) Используйте ключевое слово out:

   public static int Location(int p_1, int p_2, int p_3, int p_4, out int XLocation, out int YLocation)
   {
        XLocation = p_2 - p_1;    
        YLocation = p_4 - p_3;
   }

Вот сравнение этих методов: multiple-return-values.

Самый быстрый способ (лучшая производительность):

public KeyValuePair<int, int> Location(int p_1, int p_2, int p_3, int p_4)
{                 
    return new KeyValuePair<int,int>(p_2 - p_1, p_4-p_3);
}

Ответ 2

Используйте структуру или класс:

public struct Coordinates
{
    public readonly int x;
    public readonly int y;

    public Coordinates (int _x, int _y) 
    {
        x = _x;
        y = _y;
    }
}

public static Coordinates Location(int p_1, int p_2, int p_3, int p_4) 
{
    return new Coordinates(p_2 - p_1, p_4 - p_3);
}

Я нахожу его более красивым, чем использование ключевого слова out.

Ответ 3

Вы не можете вернуть 2 значения таким образом. Но вы можете передавать переменные как внешние переменные, например:

  public static void Location(int p_1, int p_2, int p_3, int p_4, out int XLocation, out int YLocation)
{
    XLocation = p_2 - p_1;

    YLocation = p_4-p_3;
}

Затем вам просто нужно передать целевые переменные методу:

int Xlocation, YLocation;
Location(int p_1, int p_2, int p_3, int p_4, out int XLocation, out int YLocation);

и он заполнит их вычисленными значениями.

Ответ 4

Невозможно вернуть два значения оператором "return". Вы можете использовать следующий код с 'struct':

public static Position Location(int p_1, int p_2, int p_3, int p_4)
{

Position location;
location.xLocation = p_2 - p_1;
location.yLocation =p_4-p_3;;

return location;
}

public struct Position
{
public int xLocation;
public int yLocation;
}

Ответ 5

С С# 7.0 вы можете использовать Tuples следующим образом:

(string, string) LookupName(long id) // tuple return type
{
    ... // retrieve first, middle and last from data storage
    return (first, last); // tuple literal
}

var names = LookupName(id);
WriteLine($"found {names.Item1} {names.Item2}.");

Дополнительную информацию можно найти здесь.

Ответ 6

Вы можете использовать out, структуру Coordinate или Tuple.

С кортежем:

public Tuple<int, int> GetLocation()
{
     return new Tuple<int,int>(1,2);
}

Ответ 7

Если вы используете формы Windows, вы можете использовать Point struct;

public static Point Location(Point p1, Point p2)
{
    return new Point(p2.X - p1.X, p2.Y - p1.Y);
}   

Ответ 8

Если метод не является частью публичного контракта, я предпочитаю использовать кортежи:

private Tuple<int, string> Foo()
{
  // ...
}

Ответ 9

Вы можете использовать параметры Tuple<T1, T2> или использовать.

Ответ 10

использовать список массивов

public ArrayList Location(int p_1, int p_2, int p_3, int p_4)
{
 ArrayList ar = new ArrayList();
 ar.AddRange(new string[] { "", "" });  
 int  XLocation = p_2 - p_1;
 int YLocation = p_4-p_3;
 ar[0] = XLocation.ToString(); 
 ar[1] = YLocation.ToString(); 
 return ar;
 }