문제

나는 2 차원 들쭉날쭉 한 배열 (항상 직사각형이지만)을 가지고 있는데, 이는 전통적인 루프를 사용하여 초기화합니다.

var myArr = new double[rowCount][];
for (int i = 0; i < rowCount; i++) {
    myArr[i] = new double[colCount];
}

나는 일부 LINQ 기능이 나에게 한 가지 진술에서 이것을 할 수있는 우아한 방법을 줄 것이라고 생각했다. 그러나 내가 생각해 낼 수있는 가장 가까운 것은 다음과 같습니다.

double[][] myArr = Enumerable.Repeat(new double[colCount], rowCount).ToArray();

문제는 단일을 만드는 것 같습니다. double[colCount] 각 행에 새 배열을 할당하는 해당 참조를 할당합니다. 너무 비밀스럽게도 이것을 할 수있는 방법이 있습니까?

도움이 되었습니까?

해결책

double[][] myArr = Enumerable
  .Range(0, rowCount)
  .Select(i => new double[colCount])
  .ToArray();

다른 팁

당신이 가진 것은 작동하지 않을 것입니다 new 전화하기 전에 발생합니다 Repeat. 배열의 생성을 반복하는 것이 필요합니다. 이것은 그것을 사용하여 달성 할 수 있습니다 Enumerable.Range 방법 범위를 생성 한 다음 수행합니다 Select 작업 그 범위의 각 요소를 새로운 배열 인스턴스에 매핑합니다 ( 에이미 B의 대답).

그러나 나는 당신 이이 경우에 그렇게하는 것이 실제로 적절하지 않은 곳에서 LINQ를 사용하려고한다고 생각합니다. LINQ 솔루션 이전에 가지고 있던 것은 괜찮습니다. 물론, 당신이 Enumerable.Repeat, 당신은 다음과 같은 새 항목을 생성하는 자체 확장 방법을 작성할 수 있습니다.

    public static IEnumerable<TResult> Repeat<TResult>(
          Func<TResult> generator,
          int count)
    {
        for (int i = 0; i < count; i++)
        {
            yield return generator();
        }
    }

그런 다음 다음과 같이 호출 할 수 있습니다.

   var result = Repeat(()=>new double[rowCount], columnCount).ToArray();

행동이 맞다 - Repeat() 제공된 객체를 여러 번 포함하는 시퀀스를 반환합니다. 다음 트릭을 수행 할 수 있습니다.

double[][] myArr = Enumerable
    .Repeat(0, rowCount)
    .Select(i => new double[colCount])
    .ToArray();

당신은 그것을 할 수 없습니다 Repeat 방법 : element 매개 변수는 한 번만 평가되므로 실제로는 항상 동일한 인스턴스를 반복합니다. 대신, 원하는 것을 수행하는 방법을 만들 수 있으며, 이는 값 대신 람다를 취할 수 있습니다.

    public static IEnumerable<T> Sequence<T>(Func<T> generator, int count)
    {
        for (int i = 0; i < count; i++)
        {
            yield return generator();
        }
    }

    ...

    var myArr = Sequence(() => new double[colCount], rowCount).ToArray();

방금이 기능을 썼습니다 ...

    public static T[][] GetMatrix<T>(int m, int n)
    {
        var v = new T[m][];
        for(int i=0;i<m; ++i) v[i] = new T[n];
        return v;
    }

작동하는 것 같습니다.

용법:

float[][] vertices = GetMatrix<float>(8, 3);

는 어때

var myArr = new double[rowCount, colCount];

또는

double myArr = new double[rowCount, colCount];

참조: http://msdn.microsoft.com/en-us/library/aa691346(v=vs.71).aspx

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top