如何使用Linq从列表的列表中创建查找
本文关键字:列表 创建 查找 Linq 何使用 | 更新日期: 2023-09-27 18:09:34
我的输入数据是一个列表的行,如下所示,称之为lines
author1::author2::author3 - title
我创建了一个提取作者和标题的函数:
ExtractNameAndAuthors(string line, out string title, IList<string> authors)
我现在想用Linq创建一个查找(illookup)对象,格式为:
有人真正精通Linq吗?关键:标题
取值范围:作者列表
var list = new []{"author1::author2::author3 - title1",
"author1::author2::author3 - title2",};
var splited = list.Select(line => line.Split('-'));
var result = splited
.ToLookup(line => line[1],
line => line[0].Split(new[]{"::"}, StringSplitOptions.RemoveEmptyEntries));
LINQ通常不能很好地处理out
参数。您可以这样做,但通常最好避免这样做。与其通过参数传递数据,不如创建一个保存标题和作者列表的新类型,以便ExtractNameAndAuthors
可以返回该类型的实例:
public class Book
{
public Book(string title, IList<string> authors)
{
Title = title;
Authors = authors;
}
public string Title{get;private set;}
public IList<string> Authors{get; private set;}
}
一旦你有了这个,并相应地修改了ExtractNameAndAuthors
,你可以这样做:
var lookup = lines.Select(line => ExtractNameAndAuthors(line))
.ToLookup(book => book.Title, book => book.Authors);
public class Book
{
public Book(string line)
{
this.Line = line;
}
public string Line { get; set; }
public string[] Authors
{
get
{
return Line.Substring(0, Line.IndexOf("-") - 1).Split(new string[] { "::" }, StringSplitOptions.RemoveEmptyEntries);
}
}
public string Name
{
get
{
return Line.Substring(Line.IndexOf("-") + 1);
}
}
}
static void Main(string[] args)
{
var books = new List<Book>
{
new Book("author1::author2::author3 - title1"),
new Book("author1::author2 - title2")
};
var auth3books = books.Where(b => b.Authors.Contains("author3"));
}