2015-09-04 10 views
5

का उपयोग कर मूल्य के आधार पर इस वर्ग को देखते हुए:विभाजन सूची <T> अल्पविराम से अलग संपत्ति Linq

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

मान लीजिए मैं है निम्नलिखित List<Article> जहां कुछ लेखों को एक अल्पविराम से अलग नाम हो:

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

है एक तरीका है, एक 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-अप एक वस्तु की बचत होगी वहाँ था .. ।] में दो से अधिक गुण

यद्यपि आप new टाल नहीं सकते पूरी तरह आईएनजी, आप Article अंदर अलग-अलग प्रॉपर्टी की नकल छुपा है, इस तरह से काफ़ी अपने कोड की पठनीयता में सुधार कर सकते हैं:

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 इस प्रकार दिखाई देगा:

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

इसने किसी भी कोड को नहीं हटाया, बस इसमें से कुछ को फिर से बदल दिया। हालांकि, Article की गुणों की प्रतिलिपि Article में कॉपी करने का मौका कम हो गया है जिसे आप नए जोड़े गए गुणों की प्रतिलिपि बनाने के लिए भूल गए हैं।

+0

शानदार, धन्यवाद। मैं इस तरह से बहुत करीब आ गया था, लेकिन मैं उम्मीद कर रहा था कि एक ऐसा तरीका था जो मुझे एक वस्तु को नया कर देगा क्योंकि मेरी कक्षा एक डीटीओ है और जैसा कि आप कल्पना कर सकते हैं, यह दो से अधिक है गुण;) –

+0

@ सर्गीपापसीट यह एक उचित अवलोकन है। यद्यपि आप 'नया' पूरी तरह से नहीं बच सकते हैं, फिर भी आप बेहतर रखरखाव के लिए अपने कोड को पुन: व्यवस्थित कर सकते हैं। – dasblinkenlight

+0

साफ दृष्टिकोण। अगर मैं कर सकता तो मैं आपको फिर से उखाड़ दूंगा;) जो मैंने आखिरकार किया है वह एक विस्तार विधि के अंदर लिनक के रूपांतरण बिट को टकरा गया है। –

संबंधित मुद्दे