2011-02-12 3 views
0

다음이 가능한지 알고 싶습니다. 여전히 람다 식을 고민하고 있습니다.C# 람다 다중 기준, 하위 목록

GetAll(x => x.Username.ToUpper().Contains(SEARCH) 
      && x.AddressList.Type_ID == 98.ToList(); 

이 코드의 문제는 "주소"가 목록이라는 것입니다. 본질적으로 우리는 1) UserName에 대해 검색을 수행하고 2) 자식 목록의 속성과 일치 한 후에 List를 반환하고 싶습니다.

의미 상으로 위의 코드는 작동하지 않습니다. 'Type_ID'는 AddressList가 단일 항목이 아니라 List라는 사실 때문에 선택 항목으로 사용할 수 없기 때문입니다.

이 작업을 수행 할 수 있습니까?

+0

가 .. 그 형태 무엇인가가 .. 더 많은 코드를 TYPE_ID 속성을 제공하시기 바랍니다있다 않습니다 .. 여기에 몇 가지 예제 코드는 . –

답변

3

비슷한 의미입니까?

GetAll(x => x.Username.ToUpper().Contains(SEARCH) 
      && x.AddressList.Any(e => e.Type_ID == 98)); 
0

목록에서 작동하는 확장 방법이 있지만 원하는 작업이 여전히 명확하지 않습니다. 결과를 원하십니까 AddressList의 항목의 Type_ID가 98입니까? 그렇다면 Any 기능을 사용하십시오. 목록의 모든 주소가 모두를 사용하는 것보다 해당 유형 ID를 가져야하는 경우.

class Address 
{ 
    public int Type_ID { get; set; } 
    public Address(int Type_ID) 
    { 
     this.Type_ID = Type_ID; 
    } 
} 

class Entry 
{ 
    public List<Address> AddressList { get; set; } 
    public string UserName { get; set; } 
    public Entry(string name, List<Address> addresses) 
    { 
     AddressList = addresses; 
     this.UserName = name; 
    } 
} 

class EntryList 
{ 
    private List<Entry> entries; 

    public IEnumerable<Entry> GetAll(Func<Entry, bool> filter) 
    { 
     return entries.Where(filter).ToArray(); 
    } 

    public EntryList(List<Entry> entries) 
    { 
     this.entries = entries; 
    } 
} 

static void Main(string[] args) 
{ 

    EntryList e1 = new EntryList(new List<Entry>() 
     {new Entry("Fred with 1 98 address", new List<Address> { new Address(97), new Address(98) }), 
     new Entry("Bob with no 98 address", new List<Address> { new Address(96), new Address(97) }), 
     new Entry("Jerry with all 98 addresses", new List<Address> { new Address(98), new Address(98) })}); 

    var all98 = e1.GetAll(x => x.AddressList.All(y => y.Type_ID == 98)); 
    var any98 = e1.GetAll(x => x.AddressList.Any(y => y.Type_ID == 98)); 

    Console.WriteLine("Results for ALL:"); 
    foreach (var e in all98) 
     Console.WriteLine(e.UserName); 
    Console.WriteLine("Results for ANY:"); 
    foreach (var e in any98) 
     Console.WriteLine(e.UserName); 
} 

출력은 다음과 같습니다 :

주소가 주소 목록을 포함 무엇
Results for ALL: 
Jerry with all 98 addresses 
Results for ANY: 
Fred with 1 98 address 
Jerry with all 98 addresses 
+0

나는 이것이 왜 투표에 실패했는지 이해하지 못한다 ... 문제가 무엇인지 알기 위해 투표를 중단 할 때 의견을 게시 해주십시오. 이 답변에는 많은 노력이 필요했습니다. – BlueMonkMN