2017-11-16 2 views
5

이것은 제목이 매우 어려운 질문입니다.첫 번째 요소가 조건과 일치하는 모든 배열을 목록에서 찾습니다.

C#의 경우 에 배열 된 int[,] 배열 집합이 있으며 각 배열은 경로를 형성하는 좌표 집합을 보유합니다. 예는 { {0,0}, {0,1}, {1,1}, {2,1} }입니다.

이제 조건과 일치하는 모든 경로의 첫 번째 인덱스 중 하나와 동일한 첫 번째 인덱스를 가진 모든 경로를 paths에 보관하고 싶습니다.

paths.Where(x => x.GetLength(0) % 2 == 1).ToList(); 

이 처음 좌표 중 {0,0} 또는 일부 배열을 포함하는 목록을 반환 말 :

더 무슨 뜻인지 설명하기 위해이 홀수 길이의 모든 경로를 되찾아 예를 들어, {0,1}. paths ~ be paths.Where(x=> x의 첫 번째 좌표는 {0,0} 또는 {0,1} )입니다. 내가 어떻게 이걸 얻을 수 있니?

바라건대, 나는 뜻을 이해할 수 있습니다. 이처럼

+2

경로가 있기 때문에 항상 2 일 것입니다. 두 속성이있는 좌표 클래스가 있다고 생각하십니까? –

+0

'x [0] [0] == 0 && x [0] [1] == 1'과 같은 것을 의미합니까? –

+0

@NevilleNazerane 다른 옵션이있는 경우 가장 좋지 않을 것입니다. 이미 코드의 다른 부분에서이 '경로'목록을 사용 했으므로 –

답변

0

:

var filteredPaths = paths.Where(x => x[0, 0] == 0 && x[0, 1] == 0 || x[0, 0] == 0 && x[0, 1] == 1); 

또는 동일한 수집 유형으로 작업을 계속 선호하는 경우 :

List<int[,]> filteredPaths = paths.Where(x => x[0, 0] == 0 && x[1, 0] == 0 || x[0, 0] == 0 && x[1, 0] == 1).ToList(); 
0

여기 다차원 요소를 나타내는되어 아래의 목록을 가정하고, 그것에 대해 가야 하나입니다 :

List<short[,]> paths = new List<short[,]> 
        { 
         new short[3, 2] { { 0, 0 }, { 4, 5 }, { 6, 7 } }, 
         new short[3, 2] { { 0, 1 }, { 8, 9 }, { 10, 11 } }, 
         new short[3, 2] { { 1, 1 }, { 1, 3 } ,{ 6, 1 } }, 
         new short[3, 2] { { 2, 1 }, { 3, 5 }, { 7, 7 } } 
        }; 

즉,

0123을 정의합니다.
short[,] firstCriteria = new short[1, 2] { { 0, 0 } }; 
short[,] secondCriteria = new short[1, 2] { { 0, 1 } }; 

516,만 필터링하는 첫 번째 좌표 잘라야 다차원 배열 할 수있게한다 확장 메소드를 정의한다.

static class Helper 
{ 
     public static IEnumerable<short> SliceRow(this short[,] array, short row) 
     { 
      for (var i = array.GetLowerBound(1); i <= array.GetUpperBound(1); i++) 
      { 
       yield return array[row, i]; 
      } 
     } 
} 

는 다음을 수행 할 수 있습니다 :

var resutSet = 
      paths.Where(e => e.SliceRow(0).SequenceEqual(firstCriteria.Cast<short>()) || 
        e.SliceRow(0).SequenceEqual(secondCriteria.Cast<short>())).ToList(); 

resultSet 지금 주어진 기준, 즉 충족이 개 multidimentional 배열 포함됩니다 :

{ { 0, 0 }, { 4, 5 }, { 6, 7 } , 
    { 0, 1 }, { 8, 9 }, { 10, 11 } } 
1

은 당신이 당신의 현재 데이터를 사용하여 설정하는 경우를 구조를 사용하면이 작업을 수행 할 수 있지만 구문이 꽤 좋지는 않습니다. A. Milto가 대답에서 제안한 것과 기본적으로 같습니다. 단, 빈 경로의 경우 예외를 throw하지 않도록 경계 검사가 필요하다는 점만 다릅니다. 당신과 같이 당신의 경로를 정의한다면 : 다음

var arrayPaths = new List<int[,]>(); 
arrayPaths.Add(new[,] { { 0, 0 }, { 0, 1 }, { 1, 1 }, { 2, 1 } }); // Include: starts with (0, 0) 
arrayPaths.Add(new[,] { { 0, 1 }, { 0, 1 }, { 1, 1 }, { 2, 1 } }); // Include: starts with (0, 1) 
arrayPaths.Add(new[,] { { 1, 0 }, { 0, 1 }, { 1, 1 }, { 2, 1 } }); // Exclude: starts with (1, 0) 
arrayPaths.Add(new int[0,0]);          // Exclude: has no data 

에서 시작 경로의 일부를 (0, 0) 또는 (0, 1)입니다 :

arrayPaths.Where(p => 
    p.GetUpperBound(0) >= 0 && 
    p.GetUpperBound(1) >= 1 && 
    (
     (p[0, 0] == 0 && p[0, 1] == 0) || 
     (p[0, 0] == 0 && p[0, 1] == 1) 
    )); 

네빌 Nazerane 좋은 제안을했다 그의 의견에서 : 정수 배열이 아닌 다른 데이터 구조를 사용하여 점을 표현하면 훨씬 쉽게 이해할 수있는 코드가 생성되어야합니다.당신이에 관심이

var objectPaths = new List<List<Coordinate>>(); 
objectPaths.Add(new List<Coordinate> { new Coordinate(0, 0), new Coordinate(0, 1), new Coordinate(1, 1), new Coordinate(2, 1) }); 
objectPaths.Add(new List<Coordinate> { new Coordinate(0, 1), new Coordinate(0, 1), new Coordinate(1, 1), new Coordinate(2, 1) }); 
objectPaths.Add(new List<Coordinate> { new Coordinate(1, 0), new Coordinate(0, 1), new Coordinate(1, 1), new Coordinate(2, 1) }); 
objectPaths.Add(new List<Coordinate>()); 

이제 경로의 부분 집합 :

public struct Coordinate 
{ 
    public Coordinate(int x, int y) 
    { 
     X = x; 
     Y = y; 
    } 

    public int X { get; } 
    public int Y { get; } 

    public bool Equals(int x, int y) => 
     X == x && Y == y; 
} 

그런 다음이 같은 위에 주어진 경로의 집합을 정의 할 수 있습니다 : 예를 들어, 당신은과 같이 좌표를 정의한다고 가정 :

objectPaths.Where(p => p.Count > 0 && (p[0].Equals(0, 0) || p[0].Equals(0, 1))); 

코드에서 경로를 지정하기위한보다 간결한 구문을 원할 경우 경로를 나타내는 매우 간단한 클래스를 고려할 수 있습니다. 예를 들어 :

public class Path : List<Coordinate> 
{ 
    public Path() { } 

    public Path(params (int x, int y)[] coordinates) => 
     AddRange(coordinates.Select(c => new Coordinate(c.x, c.y))); 
} 

지금 당신은 같은 경로의 집합을 정의 할 수 있습니다 :

var paths = new List<Path>(); 
paths.Add(new Path((0, 0), (0, 1), (1, 1), (2, 1))); 
paths.Add(new Path((0, 1), (0, 1), (1, 1), (2, 1))); 
paths.Add(new Path((1, 0), (0, 1), (1, 1), (2, 1))); 
paths.Add(new Path()); 

그리고 당신이 원하는 부분 집합을 선택하는 구문은 이전과 동일합니다.

관련 문제