Как вернуть 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()
{
}
Ответы
Ответ 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;
}