2013-05-21 2 views
1

나는 IList<Person> 개체가 있습니다. Person 클래스 등 필드, FirstName, LastName을 가지고IList 가져 오는 중<object_type>

내가 IList<string>를받는 함수를 가지고 있고이 IList<Person> 개체의 동일한 순서로 FirstNames의 목록을 전달하고자합니다. Person 목록의 모든 이름을 가진 List를 작성하지 않고이를 수행 할 수있는 방법이 있습니까? 어쩌면 IEnumerable<string> 내가 다른 매개 변수를 취할 수있는 기능으로 변경 될 가능성이있는 경우에 (ILIst<Person> 이외의 함수 문자열이 아닌 사람에 따라 다릅니다) 무엇

? 그래도 IList<string>을 사용하고 싶습니다.

+0

@TimSchmelter가 : 그는이'IList의 있다'... 그는 그 내용이'Person.FirstName' 있습니다'IList의 '에 그 변경하고자합니다. –

+0

정말로 'IList '을 원합니까? 아니면'IReadOnlyList '으로 충분합니까? 'IList '도'Add '와 같은 메소드를 포함하고 있습니다. 'IReadOnlyList Select (이 IReadOnlyList 리스트, Func func)'확장 메소드는 쉽게 만들 수 있습니다. – hvd

답변

4

Enumerable.Select은 문자열 (이름)의 IEnumerable을 반환합니다.

http://msdn.microsoft.com/en-us/library/bb548891.aspx

myFunction(people.Select(o => o.FirstName))

당신이 정말 List

myFunction(people.Select(o => o.FirstName).ToList())

Enumerable.Select 전달하려는 경우도)이 ToList (에 추가 할 수는 C#으로 도입 된 방법이다 3 LINQ의 일부로. LINQ here에 대해 더 자세히 읽어보십시오. 지연된 실행 here에 대한 간략한 설명을 참조하십시오.

+0

LINQ에 대해 조금 더 읽었으며 닷넷 컴파일러가 쿼리의 일부를 최적화 할 것이라는 점은 상당히 인상적이었습니다. 특히 IEnumerable에서 Count 메서드를 사용하면 LINQ를 반복 할 필요가 없지만 컬렉션에 Count 메서드가 있으면 사용할 수 있습니다. – bpeikes

0

IEnumerable<T> (여기서 T는 값 유형)을 허용 할 수 있습니다. 예 : public void Foo(IEnumerable<string> firstNames) { ... }. IList<T>처럼 목록을 반복하고 색인으로 액세스하지 않으려는 경우에만 유효합니다.

괜찮다고 가정하고 LINQ 메서드를 수행하여 열거 자 개체를 간단하게 만들 수 있습니다 : myPersonsList.Select(person => person.FirstName);. Enumerable의 작동 원리 (지연 실행) 때문에 새 목록을 만든 다음 반복합니다.

0

위의 답변을 모두 사용하면 문제가 해결되지만 사용자의 방법보다는 확장 방법을 사용하는 것이 좋습니다.

참조 용으로 붙여 넣습니다.

class Program 
{ 
    static void Main(string[] args) 
    { 
     List<Person> persons = new List<Person>(); 
     persons.Select(c => c.FirstName).DoSomething(); 
    } 
} 

public static class StringListExtension 
{ 
    public static int DoSomething(this IEnumerable<string> strList) 
    { 
     return strList.Count(); 
    } 
} 

class Person 
{ 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
}