2015-09-04 8 views
5

を使用して:分割リスト<T>このクラスを考えるとLINQの

var list = new List<Article> 
{ 
    new Article { Name = "Article1, Article2, Article3", Colour = "Red" }, 
    new Article { Name = "Article4, Article5, Article6", Colour = "Blue" }, 
} 

です:

public class Article 
{ 
    public string Name { get; set; } 
    public string Colour { get; set; } 
} 

私は記事のいくつかは、カンマ区切りの名前が含まれているList<Article>を以下していると仮定1つのLinqステートメントで、各カンマ区切りの名前が別の記事になるリストを取得する方法がありますか?

var list = new List<Article> 
{ 
    new Article { Name = "Article1", Colour = "Red" }, 
    new Article { Name = "Article2", Colour = "Red" }, 
    new Article { Name = "Article3", Colour = "Red" }, 
    new Article { Name = "Article4", Colour = "Blue" }, 
    new Article { Name = "Article5", Colour = "Blue" }, 
    new Article { Name = "Article6", Colour = "Blue" }, 
} 

答えて

7

あなたはSelectManyでそれを行うことができます。

var res = list.SelectMany(
    art => art.Name.Split(',').Select(n => 
     new Article { 
      Name = n.Trim() 
     , Colour = art.Colour 
     } 
    ) 
); 

Demo.

私は私のクラスの[以来、私NEWINGアップオブジェクトを保存するような方法があった期待していました。.. 。】かなりつ以上の特性

を有します

public class Article { 
    public string Name { get; set; } 
    public string Colour { get; set; } 
    public Article Rename(string newName) { 
     return new Article { 
      Name = newName 
     // Copy the remaining attributes 
     , Colour = this.Colour 
     }; 
    } 
} 

今、あなたのLINQは、次のようになります:あなたは完全に-ing newを避けることはできませんが、このように、Article内の個々のプロパティのコピーを非表示にすることで、かなりあなたのコードの可読性を向上させることができます

var res = list.SelectMany(art => art.Name.Split(',').Select(n => art.Rename(n.Trim()))); 

これはコードを削除しなかっただけで、一部を再切り捨てただけです。ただし、ArticleのプロパティのコピーをArticleに配置すると、新しく追加されたプロパティのコピーを忘れてしまう可能性が低くなります。

+0

賢い、ありがとう。私は非常にこれに非常に近い何かに非常に近いところに来ましたが、クラスがDTOであり、あなたが想像することができるようにオブジェクトを新しくするのを助ける方法があることを期待していました。プロパティ;) –

+0

@SergiPapaseitそれは公正な観察です。 'new'を全く避けることはできませんが、より良い保守性のためにコードを再構築することができます。 – dasblinkenlight

+0

すっきりしたアプローチ。もし私ができるなら、私はあなたにもう一度upvoteしたいと思う;) 私が最後にやったことは、linqの変形ビットを拡張メソッドの内側に置くことです。 –

関連する問題