2014-09-28 2 views
0

.ToString() 메서드를 구현하는 개체 목록이 있습니다. 목록의 각 항목에 대해 .ToString() 메서드를 호출하고 문자열 목록을 가져 오기가 정말 쉽습니다.목록의 각 항목에서 .ToString() 메서드를 호출하는 올바른 방법은 무엇입니까?

여기 foreach에서이를 수행하는 방법이 있습니다.

List<string> entityNames = new List<string>(); 
foreach (Entity parent in parents) 
{ 
    entityNames.Add(parent.ToString()); 
} 

이것은 내가 생각해 낸 것이고, 더 좋은 방법이 있습니까?

IList<string> entityNames2 = (from parent in parents where true select user.ToString()).ToList(); 
+0

사이드 노트 : "더 나은"의미가 무엇인지 설명하지 않은 "최고"는 일반적으로 나쁜 질문입니다. 대답을 바탕으로 "짧을수록 좋습니다"해결책을 찾고있었습니다. 제 의견을 받아 들였습니다. –

답변

6

목록에는 원하는대로 정확히 수행하는 ConvertAll() 메서드가 있습니다.

, 당신은 parents이 작동하려면 목록이어야한다는

List<string> entityNames = parents.ConvertAll(p => p.ToString()); 

주의 할 것 기존 목록에서 새 목록을 생성하려면 방법은 IEnumerables에 대해 정의되어 있지 않습니다.

IEnumerables를 들어, 당신은 또한 일반 select()를 사용할 수있는 다음 나중에 ToList() 전화 :

parents.Select(p=>p.ToString()).ToList(); 

을 (이 라인에 해당하면 쿼리 구문에 함께했다,하지만 linq method syntax 사용)

이 방법은 ConvertAll()보다 약간 효율적입니다. 첫 번째 경우에는 올바른 크기의 새 목록이 한 번 할당되고 두 번째 경우에는 올바른 크기를 미리 알 수 없으므로 새 목록이 필요합니다. lly. 대부분의 경우이 차이는 미미 대부분이고, 두 번째 방법은 단지

+0

+1. OP가 크기에 따라 가장 좋은 것을 찾고 있기 때문에 Select에서'p => p.' 부분을 삭제할 수 있습니다 :'.Select (ToString)'는 5 문자 더 짧을 것입니다. –

+1

@Alexei, 나는 이것이 작동하지 않을 것이라고 생각한다. 람다 구문을 통해 새로운 메소드를 생성하는 대신 올바른 서명을 가진 메소드를 전달할 수 있지만,이 경우에는'x.Select (ToString) '컴파일러는 x에있는 요소의 ToString()이 아니라 현재 메소드의 클래스의 ToString()을 사용하려고 시도합니다. 둘 다 잘못된 서명 (Func 이 아님) – HugoRune

+0

HugoRune, 실제로 맞습니다. 실제로 컴파일하는 데에도 실패합니다. 내가 무엇을 생각하고 있는지 확신 할 수 없습니다. 'Convert.ToString'은 작동하지만,'parents.Select (Convert.ToString) .ToList()'와 같이 3 문자 길어집니다. –

관련 문제