2013-06-27 2 views
3

클래스 목록을 만들었습니다. 여기 코드를 볼 수 있습니다 :C#의 목록에서 데이터 가져 오기

public class People{ 
     public string name; 
     public int age;  
    } 

public List<People> peopleInfo = new List<People>(); 

제 문제는 제가 예를 들어 이름을 가지고 있고 나이를 알고 싶다는 것입니다. 이 데이터를 얻으려면 어떻게해야합니까? 나는 이름 또는이에 의해 특정 위치에 세 얻을 수 있습니다 :

int pos = peopleInfo[0].name; 

을하지만 난 그것을 거꾸로 방법을 어떻게 할 수와 이름의 위치를 ​​얻을? 나는 이것을 가지고 쉽게 나이를 먹을 수 있습니다. 이것은 누구의 name 재산 "John" 같다 목록의 첫 번째 사람의 인덱스를 반환합니다

var searchForName = "John"; 
int index = peopleInfo.FindIndex(p => p.name == searchForName); 

:

+1

자주 수행해야 할 작업입니까, 아니면 가끔씩 수행해야합니까? 또한이 목록을 사용하여 다른 많은 일을하고 있습니까? 데이터 구조를 변경하거나 추가 데이터 구조를 작성하면이 작업에 더 적합 해 지므로 더 쉽고 효율적으로 작업을 수행 할 수 있습니다. – Servy

답변

4

당신은 FindIndex 방법을 사용할 수 있습니다. 물론 "John"이라는 이름을 가진 사람들이 많이있을 수 있으며 모든 것을 찾을 수 있습니다. 이를 위해 당신이 LINQ를 사용할 수 있습니다 : 당신은 단지를 찾을 수

foreach(People person in peopleInfo.Where(p => p.name == searchForName)) 
{ 
    person.age ... 
} 
+0

무엇이'=>'?? 나는 이전에 [이 답변] (http://stackoverflow.com/a/1344242/1275574)을 참조하십시오. – AminM

+1

람다 연산자는 람다 식을 만드는 부분입니다. http://msdn.microsoft.com/en-us/ 라이브러리/vstudio/bb397687.aspx –

+1

@JesonPark [** 람다 식 ** (일명 익명 함수)]을 정의합니다. (http://msdn.microsoft.com/en-us/library/vstudio/bb397687.aspx) –

1
int index = peopleInfo.FindIndex(p => p.name == "TheName"); 

나 :

IEnumerable<int> indexes = peopleInfo.Select((p, i) => new { p, i }) 
            .Where(x => x.p.name == searchForName) 
            .Select(x => x.i); 
foreach(int i in indexes) 
{ 
    peopleInfo[i].age ... 
} 

을하지만 당신이 정말로 그렇게하지 않으면 인덱스가 필요합니다,이 훨씬 더 간단합니다 직접 개체 ...

People person = peopleInfo.FirstOrDefault(p => p.name == "TheName"); 
4

이름으로 사람을 찾으려면 FindIndex를 사용할 수 있습니다. 그러나이 작업을 자주 수행 할 경우 각 FindIndex 호출이 전체 목록에서 하나씩 레코드를 조회하므로 성능 문제가 발생할 수 있습니다.

아마도이 상황에서 이름으로 사람 사전을 만드는 것이 좋습니다. 또는 연령대가 이름으로 된 사전이라면 필요한 것은 사람의 나이뿐입니다.

또한 사람 이름이 고유하지 않은 경우를 생각해보십시오.

List<People> peopleInfo = new List<People>() { ... }; 
Dictionary<string, People> map = peopleInfo.ToDictionary(p => p.name); 
People p = map["John"]; 
+3

''John "'이라는 이름의 사람들이 여러 명이 있다면'ToLookup '을 권하고 싶습니다. 그렇지 않으면 "* ArgumentException : 같은 키를 가진 항목이 이미 추가되었습니다. *" –