C # лямбда несколько критериев, дочерний список - PullRequest
0 голосов
/ 12 февраля 2011

Хотелось бы узнать, возможно ли следующее, все еще разбираясь с лямбда-выражениями.

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

Проблема с этим кодом в том, что "Адрес" - это список.По сути, мы хотели бы вернуть List после 1) выполнения поиска по UserName и 2) сопоставления свойства дочернего списка.

Семантически приведенный выше код не работает, так как «Type_ID» недоступен в качестве выбора из-за выборак тому, что AddressList является списком, а не единым целым.

Можно ли это сделать?

Ответы [ 2 ]

3 голосов
/ 12 февраля 2011

Ты имеешь в виду что-то вроде?

GetAll(x => x.Username.ToUpper().Contains(SEARCH) 
             && x.AddressList.Any(e => e.Type_ID == 98));
0 голосов
/ 12 февраля 2011

Существуют методы расширения, которые работают со списками, но все еще неясно, что вы хотите сделать. Хотите результаты, где любой элемент в AddressList имеет Type_ID 98? Если это так, используйте функцию Any. Если все адреса в списке должны иметь этот тип идентификатора, используйте All. Вот пример кода:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...