LINQ Query Использование ALL

2

Представьте себе систему маркировки фотографий...

    public class Photo
    {
      public IList<Tag> Tags {get;set;}
    }

    public class Tag
    {
      public string Name {get;set;}
    }

IList<Tag> tags = new [] {
                             new Tag{Name = "tag1"}, 
                             new Tag{Name = "tag2"}
                         };

IList<Photo> photos = GetAllPhotos();

И эта строка:

var results = //return photos when Photo.Tags contains BOTH tags

Можно ли использовать LINQ-оператор для этого?

Теги:
linq

2 ответа

11
Лучший ответ

Конечно:

// All the tags in "tags" are contained in p.Tags
var results = photos.Where(p => tags.All(tag => p.Tags.Contains(tag)));

или

// All the "tags" except the ones in p.Tags ends up as an empty set
var results = photos.Where(p => !tags.Except(p.Tags).Any());

EDIT: Обратите внимание, что это предполагает, что на самом деле у вас есть соответствующая реализация равенства в Tag. В противном случае вам понадобится что-то вроде:

var results = photos.Where(p => !tags.Select(t => t.Name)
                                     .Except(p.Tags.Select(t => t.Name)).Any());
  • 0
    Хаха, ты слишком быстр!
  • 1
    Он, вероятно, хочет совпадения с именами тегов, хотя ... не будет ли Contains сравнивать объекты?
Показать ещё 2 комментария
0
photos.Where(p => t.Tags.Contain(tags[0]) && t.Tags.Contains(tag[1]));

Его трудно узнать, какие операторы Tag имеют.

  • 1
    не будет совпадать с именами тегов (это будет операция byref), и я предполагаю, что он должен быть гибким для расширения до> 2 тегов.
  • 0
    tag[0] должен быть tag[0] tags[1] ?
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню