2

私の入力データは、以下のような行のリストです。行と呼びます

author1::author2::author3 - タイトル

著者とタイトルを抽出する関数を作成しました。

ExtractNameAndAuthors(string line, out string title, IList<string> authors)

次の形式で Linq を使用して、ルックアップ (ILookup) オブジェクトを作成したいと思います。

キー: タイトル
値: 著者のリスト

Linq に本当に堪能な人はいますか?

4

3 に答える 3

4

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);
于 2013-04-17T14:38:14.977 に答える
4
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));
于 2013-04-17T14:38:26.220 に答える
1
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"));
}
于 2013-04-17T14:44:51.337 に答える