【问题标题】:filtering list by multiple attributes按多个属性过滤列表
【发布时间】:2015-12-23 02:21:56
【问题描述】:

我正在做一个图书管理器项目。

假设我有这样的 Book 类:

public class Book {
    public string Name;
    public List<string> Tags;
}

我还有一个图书列表,一些复选框具有相同的标签值,供用户选择他们将使用哪些标签来过滤图书列表。

我想要的是通过用户选择的标签过滤书籍列表并将结果放入新列表。

例子:

Book1 有 {A, B, C} 标签,Book2 有 {A, B, D} 标签,Book3 有 {D, E, F} 标签。因此,如果用户选择 A 和 B 标签进行过滤,新列表将包含 Book1 和 Book2。或者如果他们选择 D 标记进行过滤,则新列表将包含 Book3。

【问题讨论】:

    标签: c#


    【解决方案1】:

    尝试使用 Linq:

    List<Book> Books = yourList;
    Books = Books.Where(a=>a.Tags.Where(z=>z.Intersect(userList).Any()).ToList()
    

    您已使用 Intersect 查找列表中的项目,而不是包含另一个项目中的任何项目。


    从评论看来你对Linq不太了解,“a”和“z”是lamda表达式,可以看成一个foreach循环:

    Books.Where(a=>a.Tags == "a")
    

    相当于:

    foreach(Book item in Books)
    {
       if(item.Tags == "a")
       {
         //Add item to your result;
       }
    }
    

    【讨论】:

    • 你能帮我解释一下 a=>a 和 z=>z 吗?或者也许一些文件让我阅读?谢谢!
    • 更多关于 Lambda 函数的信息:msdn.microsoft.com/en-us/library/bb397687.aspx
    • 这些方法中的 lambda 就像在集合上的 foreach 循环中声明一个变量,然后在循环通过集合时使用该变量来引用每个项目。它只是循环遍历集合中的项目的简写。
    • 还有一个问题。哪个术语在 java 和 python 中会做同样的事情?
    • 对不起,我对这两种语言不太了解,也许你可以在谷歌上做一些研究:(
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-04
    • 2014-09-15
    • 1970-01-01
    • 2021-03-17
    • 1970-01-01
    相关资源
    最近更新 更多