대응

2013-08-03 2 views
0

와 배열의 다른 유형을 재정렬 나는이있다 : 2 차원 배열의 열 값을 나타냅니다대응

string[] old = new string[] {"a","b","c","d"}; 

이 2 차원 배열의 열을 reoder하는 LINQ를 사용하는 방법

double[,] values = new double[,] {{1,2,3,4},{5,6,7,8},{1,3,5,9}}; 

문자열 배열 값의 재정렬

string[] newer = new string[] {"c","a","d","b"}; 

보조 색인 배열을 사용하여 새로운 색인을 유지하지만 LINQ를 사용하고 싶습니다! 내가 쉽게 이후, 들쭉날쭉 배열이 작업을 수행하는 것, 그리고 앞뒤로 두 사람 사이거야

 int[] aux = new int[old.Length]; 
     for (int i = 0; i < newer.Length; i++) 
     { 
      for (int j = 0; j < old.Length; j++) 
      { 
       if (old[j] == newer[i]) 
       { 
        aux[i] = j; 
       } 
      } 
     } 

     double[,] newvalues = new double[values.GetLength(0), values.GetLength(1)]; 
     for (int i = 0; i < values.GetLength(0); i++) 
     { 
      for (int j = 0; j < values.GetLength(1); j++) 
      { 
       newvalues[i, j] = values[i, aux[j]]; 
      } 
     } 

     values = newvalues; 
+1

직사각형의 [[,] 배열에 있어야합니까? 아니면 들쭉날쭉 한 [[] [] 배열에 있어야할까요? – jason

+0

직사각형, 나는 코드를 수정했다 ... newvalues ​​[i, j] = values ​​[i, aux [j]]; ' – user1204

+0

둘 사이의 변환은 충분히 쉽다. – jason

답변

1

: solved 문제입니다.

뒤통수 때리는 웃긴 그것은 매우 간단이 것입니다 : 여기

Array.Sort(keys, doubles, new CustomStringComparer(reorderedKeys)); 

그 작업 얻을 수있는 설정입니다 : 여기

var doubles = 
    new double[][] { 
     new double[] {1, 2, 3, 4}, 
     new double[] {5, 6, 7, 8}, 
     new double[] {1, 3, 5, 7}, 
     new double[] {2, 4, 6, 8} 
    }; 
var keys = new [] { "a", "b", "c", "d" }; 
var reorderedKeys = new [] { "c", "a", "d", "b" }; 

를, 내가 사용

class CustomStringComparer : IComparer<string> { 
    Dictionary<string, int> ranks; 

    public CustomStringComparator(string[] reorderedKeys) { 
     ranks = reorderedKeys 
      .Select((value, rank) => new { Value = value, Rank = rank }) 
      .ToDictionary(x => x.Value, x => x.Rank); 
    } 

    public int Compare(string x, string y) { 
     return ranks[x].CompareTo(ranks[y]); 
    } 
} 
0

당신이 할 수있는 ' IEnumerable<T>을 구현하지 않기 때문에 Linq에서 다차원 배열을 사용하지 마십시오. 대신에 들쭉날쭉 한 배열을 사용하기로 결정한 경우 :

double[][] values = new double[][] { 
    new double[]{1,2,3,4}, 
    new double[]{5,6,7,8}, 
    new double[]{1,3,5,9}}; 
//...  
newer 
    .Join(
     old.Zip(values, (key, val) => new{key, val}), 
     a => a, 
     b => b.key, 
     (a, b) => b.val) 
    .ToArray() 
+0

차원 불일치로 인해 작동하지 않습니다 ... 내 응답과 동일하게 4 * 3'values' 배열을 사용하는 반면 3 * 4이고 첫 번째 차원 (3)은 'old'길이와 일치하지 않습니다. –

+0

@AlexeiLevenkov : 악의 원본 포스터가 질문을 변경했습니다. 원본 버전은 4 * 3 – spender