2017-12-12 15 views
-2

값을 검색도 1 키, C#에서이 개 값으로 데이터 구조를 생성 및 기본적으로 x, y, z 좌표 값을 가지고 있으며 데이터 구조에 추가하는 것을 계속하고 싶습니다. 데이터를 추가 한 후 "List"와 같은 사용 가능한 "x"를 모두 가져 오려고합니다. 각 값에 대해 x의 값을 찾으려면 여러 개의 "y"값을 찾고 싶습니다. 그런 다음 특정 "x"와 "y"값에 대해 여러 개의 "z"값을 모두 찾고 싶습니다.내가 다음과 같습니다 1 키, 2 개 값과 데이터 구조를 만들려면 특정 키

예 : 좌표가 (1,2,3) 인 경우; (1,3,4); (1,2,6); (1,2,9) 값이 1 인 경우 2와 3을 가져 오려고합니다. 마찬가지로 1,2의 경우; 값 6과 9를 가져오고 싶습니다.

C#에서이 작업을 수행하는 절차를 알려주면 정말 기쁩니다. 미리 감사드립니다.

+0

: 다음과 같은 방법으로 다음

List<Coordinates> list = new List<Coordinates>(); //Populate the list 

KeyValuePair'는 키와 값을 저장한다고 말합니다. 여기에는 3 개의 값이 있으며 키가 없습니다. 찾고있는 데이터 구조가 단순한 튜플입니다. 이 하나가 아닙니다. –

+0

왜'Dictionary >'또는'Dictionary >>'이 아닌가? – juharr

+2

왜 데이터 구조를 사용하고 싶습니까, 왜 데이터를 보유하는 클래스 (A DTO)를 만들지 않고 원하는 것을 할 수 있습니까? – RaniDevpr

답변

1

너는 고유 한 키가없고 너비가 다양한 키가 있기 때문에 사전이나 KeyValuePair가 도움이 될 것입니다.

단일 값 ((X, Y, Z)의 X)을 조회 할 때 Y와 Z가 아닌 키에만 관심이 있다면 키를 사용하지 않은 값으로 채우고 레코드를 두 번 저장할 수 있습니다 (키 - 값 쌍 (1, 2, 3)(0, 1, 2)(1, 2, 3)이 되겠지만 실제로는 더 명확하지 않습니다. 당신은뿐만 아니라 튜플을, 두 값 검색 활용하고자 할 때 다음

var list = new List<Tuple<double, double, double>> 
{ 
    Tuple.Create<double, double, double>(1,2,3), 
    Tuple.Create<double, double, double>(1,3,4), 
    Tuple.Create<double, double, double>(1,2,6), 
    Tuple.Create<double, double, double>(1,2,9), 
}; 

var search = 1d; 

var results = list.Where(t => t.Item1 == search) 
        .Select(t => t.Item2); 

을 :

당신은 List<Tuple<double, double, double>>의 레코드를 저장할 수 CodeCaster의

var search = Tuple.Create<double, double>(1, 2); 

var results = list.Where(t => t.Item1 == search.Item1 && t.Item2 == search.Item2) 
        .Select(t => t.Item3); 
+0

@DragandDrop 간단한 3 값 클래스/구조체에 대한 전체 라이브러리를 가져 오는 것을 의미합니까? 잔인하고 잠재적으로 그 유형의 오용. – DavidG

+0

@DavidG, 나는 op의 이름이 벡터와 메쏘드가 포함되어있어서 실제 클래스가 유용 할 수 있다고 생각한다. 과포 평가 될 수 있다고 생각합니다. –

+0

@DragandDrop은 적어도 4 번 언급할만한 가치가 있습니다!당신은 내 하루를 만들었습니다 x) –

0

기본적으로 대답을하지만, 방법으로 (나는 그것을 만드는 시간이 걸렸지 만, 그는 빨랐다 :))

public void TestMethod() 
{ 
    List<Tuple<double, double, double>> list = new List<Tuple<double, double, double>>(); 
    list.Add(new Tuple<double, double, double>(1, 2, 3)); 
    list.Add(new Tuple<double, double, double>(1, 2, 5)); 
    list.Add(new Tuple<double, double, double>(8, 2, 3)); 
    list.Add(new Tuple<double, double, double>(1, 5, 3)); 

    var x = GetIt(1, list); 
    var y = GetIt(1, 2, list); 
} 

public List<double> GetIt(double d, List<Tuple<double, double, double>> list) 
{ 
    return (from a in list 
      where a.Item1 == d 
      select a.Item2).Distinct().ToList(); 
} 

public List<double> GetIt(double d, double e, List<Tuple<double, double, double>> list) 
{ 
    return (from a in list 
      where a.Item1 == d && a.Item2 == e 
      select a.Item3).Distinct().ToList(); 
} 
+0

OP는 단일 값을 검색 할 때 단일 값을 반환하기를 원합니다. – CodeCaster

+0

'params double []'? –

+0

@CodeCaster : 그는 다음과 같이 썼습니다. "값 1의 경우 2와 3을 가져 오려고합니다." 그래서 나를 위해 목록에 결과가 – FrankM

-1

당신이 원하는 것에 대한 접근법은 여러 가지가 있습니다. 당신은 VS2017의 +를 사용하는 경우 (.NET4.7를 표적으로 할 때 Nuget에, 그렇지 않으면 사용할 수 네이티브)

var list = new List<(double x, double y, double z)>(); 
list.Add((1,2,3)); 
list.Add((1,3,4)); 
list.Add((1,2,6)); 
list.Add((1,2,9)); 

을 값 튜플을 사용하여 X, Y 및 Z에 의해 그룹에 Linq에 사용할 수 있습니다.

는 X = 1, Y = 2

var l2 = list.Where(i=>i.x==1 && i.y==2).Select(i=>i.z); 
-2

미스 허리를 가지고 모든 Z를 검색하려면 X = 1

var l1 = list.Where(i=>i.x==1).Select(i=>i.y); 

모든 Y를 검색하고이를위한 클래스 그냥있을하려면 케이스 : Point3D structure.

장점 : 전체적으로 사용할 수있는 빌드 방식이 다양합니다. 그리고 당신은 포인트와 벡터로 놀 수 있습니다.

단점 : 단순히 3 개의 값을 저장하면 잔인합니다.

+2

세 가지 값을 저장할 데이터 유형은이 질문의 흥미로운 부분이 아닙니다. 내 downvote 어쨌든. – CodeCaster

+0

@CodeCaster, 코드를 대답으로 편집 할 시간이 충분하지 않습니다. 이것은 나쁘다고 생각합니다. 이 대답은 질문의 일부로서 대답합니다. 그것은 머물 것이다. 근본적으로 코드는 이제 모든 사람들이 동일한 linQ가 될 것입니다. 필드에 올바른 이름으로 속성. –

+0

올바른 데이터 구조를 사용하는 것이 질문의 주요 부분이 아니더라도 주요 문제였습니다. 그것을 강조하는 것은 저에게 코멘트 이상입니다. –

-1

저장하려는 항목이 키와 값이 아닌 3 개의 값이므로 사전 형식 접근 방식을 사용하지 않는 것이 좋습니다.

내가 추적을 권 해드립니다 :

  1. 클래스
  2. 사용 LINQ가 통과하는 상기 클래스가
  3. 이 목록을 확인 좌표 만듭니다.

    public class Coordinates 
    { 
        public float XCoord { get; set; } 
        public float YCoor { get; set; } 
        public float ZCoor { get; set; } 
    } 
    

    이 그럼 당신은 목록을 작성하고 필요한 데이터를 선택하는 LINQ를 사용,이 예제에서 내가 X, Y를 받아들이는 기능을 생성하고, Z는 목록을 필터링 할 수 있습니다 : 예를 들어

. 이름`으로

public List<Coordinates> SelectCoords(List<Coordinates> originalList, float? X, float? Y,float? Z) 
    { 
     List<Coordinates> filteredList = new List<Coordinates>(originalList); 

     if (X != null) 
     { 
      filteredList = filteredList.Where(v => v.XCoord == X).ToList(); 
     } 

     if (Y != null) 
     { 
      filteredList = filteredList.Where(v => v.YCoord == Y).ToList(); 
     } 

     if (X != null) 
     { 
      filteredList = filteredList.Where(v => v.ZCoord == Z).ToList(); 
     } 

     return filteredList; 
    } 

당신은 X, Y와 목록을 반환 목록을 필터링하는 방법을 선택할 수 있습니다, 그리고 또는 Z

list = SelectCoords(list, 1, 2,null);