通过LINQ检查其中每个对象包含另一个对象集合的对象集合是否包含List <string>的所有值

驴米科伐木工人

我有一个对象集合,其中每个对象都包含另一个对象集合。我需要找出最快的方法来检查它是否包含的所有值List<string>

这是一个例子:

class Video {        
  List<Tag> Tags; 
}

class Tag{
  public Tag (string name){
    Name = name;
  }

  string Name;
}

List<string> selectedTags = new List<string>();
selectedTags.Add("Foo");
selectedTags.Add("Moo");
selectedTags.Add("Boo");

List<Video> videos = new List<Video>();

// Case A
Video videoA = new Video();
videoA.Tags = new List<Tag>();
videoA.Tags.Add(new Tag("Foo"));
videoA.Tags.Add(new Tag("Moo"));
videos.Add(videoA);  

videoA LINQ应该选择它,因为它不包含所有标签。

// Case B
Video videoB = new Video();
videoB.Tags = new List<Tag>();
videoB.Tags.Add(new Tag("Foo"));
videoB.Tags.Add(new Tag("Moo"));
videoB.Tags.Add(new Tag("Boo"));
videos.Add(videoB);  

videoB 应该由LINQ选择,因为它包含所有标签。

我尝试使用foreach循环,但是它太慢了,因此我正在寻找LINQ解决方案。

foreach (Video video in videos) {
  if (video.Tags.Count() > 0) {
    bool containAllTags = true;
    foreach (string tagToFind in selectedTags) {
      bool tagFound = false;
      foreach (Tag tagItem in video.Tags) {
        if (tagToFind == tagItem.Name)
          tagFound = true;
      }
      if (!tagFound)
        containAllTags = false;
    }
    if (containAllTags)
      result.Add(videoItem);
  }
}

生成的LINQ应该如下所示:

IEnumerable<Video> = from vid in videos
                     where vid.Tags.( ..I dont know.. )
                     select vid;

我用.Any.All等等尝试了几种方法但是我找不到解决方案,也无法使用,.Intersect因为一个是List字符串的,另一个是List对象的的。请注意,在生产版本中,VideoTag元素具有更多属性。

乔恩·斯基特

使用当前代码,您在逻辑上需要:

IEnumerable<Video> result = from vid in videos
                            where selectedTags.All(tag =>
                                     vid.Tags.Any(t => t.Name == tag))
                            select vid;

或等效地:

var result = videos.Where(vid => selectedTags.All(tag => 
                                      vid.Tags.Any(t => t.Name == tag)));

当然,这是假设您已经公开Tag.Name并且是Video.Tags公开的-理想情况下是作为属性而不是作为字段。

请注意我们如何All反对selectedTags,因为(假设我已正确阅读您的要求)在视频中出现所有选定的标签很重要-选择所有视频的标签并不重要。

现在,如果您要检查很多标签并且每个视频有很多标签,那可能会比较慢。

但是,知道如何对其进行优化实际上取决于其他一些选择:

  • 如果标记的顺序不重要,您可以更改Video.Tags为集合而不是列表吗?
  • 您是否一直在浏览同一组视频,以便可以进行一些预处理?
  • 可用标签总数大吗?每个视频的标签数量如何?所选标签的数量如何?

另外,您可以将每个视频投影到其“标签列表”,然后检查所选视频集中是否有不包含的视频:

var result = videos.Where(vid => !selectedTags.Except(vid.Tags.Select(t => t.Name))
                                              .Any());

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

检查列表是否包含另一个列表中的所有项目

来自分类Dev

lodash /下划线检查一个对象是否包含另一个对象的所有键/值

来自分类Dev

打包一个包含具有自定义对象的集合的模型

来自分类Dev

检查一个位集是否包含另一个位集的所有值

来自分类Dev

QueryOver集合包含所有值

来自分类Dev

Arduino-只有第一个对象包含在另一个对象的集合/数组中时才会丢失其数据属性值

来自分类Dev

在Dictionary <string,object>中查找所有值,其中key包含子字符串

来自分类Dev

使用聚合操作将对象的集合复制到另一个集合中而没有重复项

来自分类Dev

将List <T>转换为另一个列表中所有对象的逗号分隔值列表

来自分类Dev

检查map <string,string>是否包含另一个map <string,string>

来自分类Dev

Java-删除一个集合中另一个集合中的对象,这些对象具有“等于”的任意含义

来自分类Dev

检查数组是否包含Swift中另一个数组的所有元素

来自分类Dev

有没有办法以这样一种方式在python中连接两个对象,使得一个对象中的所有值都与另一个对象中的每个值重复

来自分类Dev

如何判断对象的所有值是否存在于另一个对象中

来自分类Dev

LINQ通过另一个值获取包含在另一个列表中的对象的结果

来自分类Dev

将集合的所有列复制到对象格式的另一个集合的单个列

来自分类Dev

如何有效地从该对象中包含的另一个对象访问对象字段/属性

来自分类Dev

QueryOver集合包含所有值

来自分类Dev

Linq-获取具有列表属性的对象,该属性在另一个列表中不包含值

来自分类Dev

将List <T>转换为另一个列表中所有对象的逗号分隔值列表

来自分类Dev

来自包含对象的数组的对象,其中对象的值包含在另一个数组中

来自分类Dev

检查是否有一个对象与Symfony2中的集合中的另一个对象匹配;通知事项

来自分类Dev

如何查找具有与另一个集合中的任何值匹配的属性的所有对象?

来自分类Dev

如何按照包含每个对象中存在的属性的唯一值的另一个数组的顺序对对象数组进行排序?

来自分类Dev

oracle SQL:选择不同的值,其中它的所有记录中不包含另一个特定值

来自分类Dev

一些对象包含另一个数组的对象数组,需要通过包含数组的对象中的值对其进行过滤

来自分类Dev

根据包含来自另一个数组的所有值的数组属性过滤对象数组

来自分类Dev

有没有办法在 Java(类似 LINQ)中从另一个对象创建对象集合?

来自分类Dev

从另一个对象构造一个动态对象,该对象具有带有不同键值对的 dictionary<string, object> 属性

Related 相关文章

  1. 1

    检查列表是否包含另一个列表中的所有项目

  2. 2

    lodash /下划线检查一个对象是否包含另一个对象的所有键/值

  3. 3

    打包一个包含具有自定义对象的集合的模型

  4. 4

    检查一个位集是否包含另一个位集的所有值

  5. 5

    QueryOver集合包含所有值

  6. 6

    Arduino-只有第一个对象包含在另一个对象的集合/数组中时才会丢失其数据属性值

  7. 7

    在Dictionary <string,object>中查找所有值,其中key包含子字符串

  8. 8

    使用聚合操作将对象的集合复制到另一个集合中而没有重复项

  9. 9

    将List <T>转换为另一个列表中所有对象的逗号分隔值列表

  10. 10

    检查map <string,string>是否包含另一个map <string,string>

  11. 11

    Java-删除一个集合中另一个集合中的对象,这些对象具有“等于”的任意含义

  12. 12

    检查数组是否包含Swift中另一个数组的所有元素

  13. 13

    有没有办法以这样一种方式在python中连接两个对象,使得一个对象中的所有值都与另一个对象中的每个值重复

  14. 14

    如何判断对象的所有值是否存在于另一个对象中

  15. 15

    LINQ通过另一个值获取包含在另一个列表中的对象的结果

  16. 16

    将集合的所有列复制到对象格式的另一个集合的单个列

  17. 17

    如何有效地从该对象中包含的另一个对象访问对象字段/属性

  18. 18

    QueryOver集合包含所有值

  19. 19

    Linq-获取具有列表属性的对象,该属性在另一个列表中不包含值

  20. 20

    将List <T>转换为另一个列表中所有对象的逗号分隔值列表

  21. 21

    来自包含对象的数组的对象,其中对象的值包含在另一个数组中

  22. 22

    检查是否有一个对象与Symfony2中的集合中的另一个对象匹配;通知事项

  23. 23

    如何查找具有与另一个集合中的任何值匹配的属性的所有对象?

  24. 24

    如何按照包含每个对象中存在的属性的唯一值的另一个数组的顺序对对象数组进行排序?

  25. 25

    oracle SQL:选择不同的值,其中它的所有记录中不包含另一个特定值

  26. 26

    一些对象包含另一个数组的对象数组,需要通过包含数组的对象中的值对其进行过滤

  27. 27

    根据包含来自另一个数组的所有值的数组属性过滤对象数组

  28. 28

    有没有办法在 Java(类似 LINQ)中从另一个对象创建对象集合?

  29. 29

    从另一个对象构造一个动态对象,该对象具有带有不同键值对的 dictionary<string, object> 属性

热门标签

归档