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