배열이 필요한 variadic 기능에 대한 설계 결정은 무엇입니까?
-
13-09-2019 - |
문제
나는 궁금해서 누군가가 이것에 대해 소민을 흘릴 수 있기를 바랍니다. 그러나 왜 '매개 변수'를 취하는 c# 함수가 배열이어야합니까?
매개 변수 목록의 객체가 배열에 입력되지만 누군가가 정의되지 않은 배열 객체를 가져 오는 변수 함수를 만들려면 어떻게해야합니까?
예를 들어이 기능을 취하십시오 ...
private Int32 Sum(params Int32[] numbers)
{
return numbers.Sum(); // Using LINQ here to sum
}
아주 간단하게, 예를 들어 다른 양의 숫자를 가져갈 수 있습니다 ... 예를 들어 ...
Int32 x = Sum(1);
Int32 y = Sum(1, 2);
Int32 z = Sum(1, 2, 3);
이제 다른 양의 정수 배열을 가져 와서 모든 숫자를 요약하는 함수를 만들고 싶다고 가정 해 봅시다. 내가 아는 한 권투를 고려해야 할 것입니다 ...
private Int32 SumArrays(params Object[] numbers)
{
Int32 total = 0;
foreach (Object o in numbers)
{
Int32[] array = (Int32[])o;
total += array.Sum();
}
return total;
}
그런 다음 ...처럼 사용할 수 있습니다.
Int32[] arr1 = new Int32[] { 1, 2, 3 };
Int32[] arr2 = new Int32[] { 1, 2, 3, 4 };
Int32[] arr3 = new Int32[] { 1, 2, 3, 4, 5 };
Int32 x = SumArrays((Object)arr1, (Object)arr2);
Int32 y = SumArrays((Object)arr1, (Object)arr2, (Object)arr3);
이 배후의 추론은 무엇입니까? 왜 이것이 단일 비 배열 변수로 구현되지 않았습니까? 와 같은 params Int32
?
해결책
기능은 이미 존재하며 권투에 의지 할 필요가 없습니다.
private int SumAll(params int[][] args)
{
int result = 0;
for (int x = 0; x < args.Length; x++)
{
for (int y = 0; y < args[x].Length; y++)
{
result += args[x][y];
}
}
return result;
}
배열 배열 만 추가하면됩니다.
다른 팁
매개 변수는 단일 객체로 롤링되며 컬렉션을 보유 할 수있는 가장 낮은 수준의 객체는 배열입니다. 가변 수의 int 배열을 취하는 함수를 원한다면 int 배열 배열을 취하는 것으로 선언해야합니다.
static int SumArrays(params int[][] data)
{
int rval = 0;
for (int i = 0; i < data.Length; i++)
{
rval += data[i].Sum();
}
return rval;
}
제휴하지 않습니다 StackOverflow