2016-11-04 4 views
1

나는 ListItemCollection을 가지고 있습니다. 각 요소의 유형은 ListItem입니다. 값이 주어진 항목이있는 텍스트 만 반환하고 싶습니다. LINQ이 할 수있는 방법이 있나요ListItemCollection - LINQ를 사용하여 값에서 텍스트 가져 오기

public string GetTextFromPaymentWayCollection(string value) 
{ 
    ListItemCollection listPaymentWays = DB.GetList(); 

    foreach (ListItem item in listPaymentWays) 
    { 
    if (item.Value == value) 
    { 
     return item.Text; 
    } 
    } 
    return null; 
} 

, 대신이 기능을 사용 : 지금은

,이 기능을 사용하고?

답변

5

listPaymentWaysIEnumerable<T>을 구현하지 않는 ListItemCollection입니다. linq 메서드는 IEnumerable<T>의 확장 메서드입니다. 예를 들어

FirstOrDefault의 서명 :

public static TSource FirstOrDefault<TSource>(
    this IEnumerable<TSource> source 
) 

당신이해야하는 것은 처음이다 Cast (AN IEnumerble<ListItem>를 반환하는) 다음 FirstOrDefault 사용

var result = listPaymentWays.Cast<ListItem>() 
          .FirstOrDefault(x => x.Value == value)?.Text; 

?.은 C# 6.0 Null Proparation 기능입니다.


또한 나는 DB.GetList()가 필터링 데이터베이스가 아닌 메모리에 일어날 수 있도록 값을 얻을하는 방법을 공개 할 것을 권 해드립니다. 모든 데이터를 가져 오는 것은 낭비이며, 그 중 ListItems을 작성하면 단일 항목 만 가져옵니다.

+0

고마워,이 작품. 결국이 물음표는 무엇입니까? 아마도 그 문서에 대한 링크가 있습니까? – FrenkyB

+0

@FrenkyB - 업데이트보기 –

2
return listPaymentWays.FirstOrDefault(x => x.Value == value)?.Text; 

잘 작동해야합니다.

+0

ListItemCollection에서 FirstOrDefault를 사용할 수없는 이유는 무엇입니까? – FrenkyB

+0

@FrenkyB System.Linq를 포함 시켰습니까? – drajvver

2

Where을 사용하려면 먼저 전송해야합니다. 나머지는 단지 일반 Linq입니다.

string s = listPaymentWays.Cast<ListItem>().ToDictionary(i => i.Value, i => i.Text).Where(x => x.Value == value).FirstOrDefault().Value; 
+1

왜 사전으로 변환 한 다음'Where'합니까? 필요 없음 :) –

관련 문제