C# 为什么未筛选图书列表,且两个项目都具有名称N1&;N2出现以及如何准备可观察收集

C# 为什么未筛选图书列表,且两个项目都具有名称N1&;N2出现以及如何准备可观察收集,c#,C#,我有下面的类和它们的相关数据,在这里我试图过滤书名为“N1”的书籍,但它不起作用,我在`过滤器列表'中得到这两个书籍项目,请建议为什么以及什么是基于过滤数据填写可观察集合的最佳方法 var lstStudents = new List<Student> { new Student { Name = "studen1", Standards = new Li

我有下面的类和它们的相关数据,在这里我试图过滤书名为“N1”的书籍,但它不起作用,我在`过滤器列表'中得到这两个书籍项目,请建议为什么以及什么是基于过滤数据填写可观察集合的最佳方法

 var lstStudents = new List<Student>
        {
            new Student
            {
                Name = "studen1",
                Standards = new List<Standard> {new Standard {Name = "std1"}, new Standard {Name = "std2"}},
                Books = new List<Book> {new Book {Name = "N1", Page = "20"}, new Book {Name = "N2", Page = "30"}}
            },
            new Student
            {
                Name = "studen2",
                Standards = new List<Standard> {new Standard {Name = "std1"}},
                Books = new List<Book> {new Book {Name = "N1", Page = "20"}, new Book {Name = "N2", Page = "30"}}
            },
            new Student
            {
                Name = "studen3",
                Standards = new List<Standard> {new Standard {Name = "std1"}},
                Books = new List<Book> {new Book {Name = "N1", Page = "20"}, new Book {Name = "N2", Page = "30"}}
            }
        };

        var filterList = lstStudents.Where(c => c.Standards.Count == 1
                                          && c.Standards.Any(d => d.Name == "std1")
                                          && c.Books.Any(d => d.Name == "N1"))
            .ToList();
        //why both books with Name N1 & N2 both filtered as I am filtering with name = N1?

        var data = new ObservableCollection<Data>();

        foreach (var item in filterList)
        {
            data.Add(new Data { BookName = item.Name, BookPage = item.Books[0].Page });
        }
var lststusts=新列表
{
新生
{
Name=“studen1”,
标准=新列表{new Standard{Name=“std1”},新标准{Name=“std2”},
图书=新列表{新书{Name=“N1”,Page=“20”},新书{Name=“N2”,Page=“30”}
},
新生
{
Name=“studen2”,
标准=新列表{new Standard{Name=“std1”},
图书=新列表{新书{Name=“N1”,Page=“20”},新书{Name=“N2”,Page=“30”}
},
新生
{
Name=“studen3”,
标准=新列表{new Standard{Name=“std1”},
图书=新列表{新书{Name=“N1”,Page=“20”},新书{Name=“N2”,Page=“30”}
}
};
var filterList=lststustudents.Where(c=>c.Standards.Count==1
&&c.标准.任何(d=>d.名称==“std1”)
&&c.Books.Any(d=>d.Name==“N1”))
.ToList();
//为什么名字为N1和N2的两本书都被过滤,因为我正在用名字=N1进行过滤?
var数据=新的ObservableCollection();
foreach(过滤器列表中的变量项)
{
添加(新数据{BookName=item.Name,BookPage=item.Books[0].Page});
}
辅助班是,

 public class Data
{
    public string StudentName { get; set; }
    public string BookName { get; set; }
    public string BookPage { get; set; }
}

public class Student
{
    public string Name { get; set; }
    public List<Standard> Standards { get; set; }
    public List<Book> Books { get; set; }
}

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

public class Book
{
    public string Name { get; set; }
    public string Page { get; set; }
}
公共类数据
{
公共字符串StudentName{get;set;}
公共字符串BookName{get;set;}
公共字符串书页{get;set;}
}
公立班学生
{
公共字符串名称{get;set;}
公共列表标准{get;set;}
公共列表书籍{get;set;}
}
公共类标准
{
公共字符串名称{get;set;}
}
公共课堂用书
{
公共字符串名称{get;set;}
公共字符串页{get;set;}
}

您的查询将返回书本列表中有任何“N1”书本的学生(以及其他筛选器)

所以这些书本身并没有被过滤掉,只是没有那本书的学生

如何为满足初始筛选条件的学生返回“N1”书籍列表的示例如下:

var filterList = lstStudents.Where(c => 
c.Standards.Count == 1
&& c.Standards.Any(d => d.Name == "std1"))
.SelectMany(s => s.Books.Select(b =>                                                                                     
new {
    StudentName = s.Name,
    BookName = b.Name,
    BookPage = b.Page
})
.Where(b => b.BookName == "N1"));
然后,例如:

foreach (var item in filterList)
    {
        data.Add(new Data { StudentName = item.StudentName, BookName = item.BookName, BookPage = item.Page });
    }
首先检索符合所提供条件的学生,然后将这些学生的书籍检索到一个书籍列表中(使用
SelectMany
方法)

然后,它会过滤这些书籍,只将符合要求条件的书籍返回到一个匿名类型中,该类型还包含学生姓名。

您可以:
1-筛选所有
学生
,这些学生的
计数
符合
标准
等于
1
和姓名
std1

2-并将所有
书籍
学生姓名
直接展平到
数据
对象,
3-对book
BookName==“N1”

4-直接将结果放入
ObservableCollection
,如以下代码所示:

List<Data> filterList = lstStudents.Where(c => c.Standards.Count == 1 && c.Standards.Any(d => d.Name == "std1"))
    .SelectMany(x => x.Books.Select(y => new Data { StudentName = x.Name, BookName = y.Name, BookPage = y.Page }))
    .Where(d => d.BookName == "N1")
    .ToList();

var newData = new ObservableCollection<Data>(filterList);
结果

StudentName:studen2 BookName:N1 BookPage:20
StudentName:studen3 BookName:N1 BookPage:20

我希望这能帮到你。

你的过滤器适用于学生名单,所以这是正常的。那么如何同时过滤
标准
书籍
?我正在为你的问题添加一个答案,以一次性获得
学生名
书名
书页
。谢谢。如何从
学生
中选择
姓名
,然后创建
数据列表
?编辑以添加学生姓名(类似于@Sajid的解决方案)非常感谢非常感谢Sajid。感谢:)
StudentName:studen2 BookName:N1 BookPage:20
StudentName:studen3 BookName:N1 BookPage:20