如何使用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吗?

如何使用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"));
}