লিনক এক্সপ্রেশন দিয়ে নেস্টেড বস্তুগুলিকে কীভাবে সমতল করা যায়


125

আমি নীস্টযুক্ত বস্তুগুলিকে চ্যাপ্টা করার চেষ্টা করছি:

public class Book
{
    public string Name { get; set; }
    public IList<Chapter> Chapters { get; set; }
}

public class Chapter
{
    public string Name { get; set; }
    public IList<Page> Pages { get; set; }
}


public class Page
{
    public string Name { get; set; }
}

আমাকে একটি উদাহরণ দিন। এটি আমার কাছে ডেটা

Book: Pro Linq 
{ 
   Chapter 1: Hello Linq 
   {
      Page 1, 
      Page 2, 
      Page 3
   },
   Chapter 2: C# Language enhancements
   {
      Page 4
   },
}

আমি যে ফলাফলটি সন্ধান করছি তা নীচের ফ্ল্যাট তালিকা:

"Pro Linq", "Hello Linq", "Page 1"
"Pro Linq", "Hello Linq", "Page 2"
"Pro Linq", "Hello Linq", "Page 3"
"Pro Linq", "C# Language enhancements", "Page 4"

আমি কীভাবে এটি সম্পাদন করতে পারি? আমি এটি একটি নির্বাচিত নতুন দিয়ে করতে পারি তবে আমাকে বলা হয়েছে যে একটি সিলেকম্যানি যথেষ্ট হবে।

উত্তর:


199
myBooks.SelectMany(b => b.Chapters
    .SelectMany(c => c.Pages
        .Select(p => b.Name + ", " + c.Name + ", " + p.Name)));

অসাধারণ!!! আমার যদি ফ্ল্যাটবুক {বুকনাম, অধ্যায় নাম, পৃষ্ঠা নাম like এর মতো কোনও নতুন অবজেক্ট থাকে?
abx78

2
@ abx78: কেবলমাত্র সর্বশেষ নির্বাচনটি পরিবর্তন করুন:.Select(p => new FlatBook(b.Name, c.Name, p.Name))
ব্যবহারকারী 7116

আপনাকে বলছি ধন্যবাদ, আমার যা প্রয়োজন এটি ছিল!
abx78

1
এই একই ফলাফল উত্পাদন করে? myBooks.SelectMany(b => b.Chapters).SelectMany(c => c.Pages).Select(p => b.Name + ", " + c.Name + ", " + p.Name);
হোমার

1
@ মাস্ট্রো কেমন সম্পর্কেmyBooks.SelectMany(b => b.Chapters == null || !b.Chapters.Any()? new []{b.Name + " has no Chapters"} : b.SelectMany(c => c.Pages.Select(p => b.Name + ", " + c.Name + ", " + p.Name)));
ইউরি ফক্টোরিভিচ

50

ধরে booksনেওয়া বইয়ের একটি তালিকা:

var r = from b in books
    from c in b.Chapters
    from p in c.Pages
    select new {BookName = b.Name, ChapterName = c.Name, PageName = p.Name};

2
+1, যদিও কিছু IEnumerable<Book>করবে, একটি দরকার নেই List<Book>
ব্যবহারকারী 7116

2
myBooks.SelectMany(b => b.Chapters
    .SelectMany(c => c.Pages
        .Select(p => new 
                {
                    BookName = b.Name ,
                    ChapterName = c.Name , 
                    PageName = p.Name
                });

7
এই কোড নমুনা প্রশ্নের উত্তর দিতে পারে যদিও, এটি ব্যাখ্যা অভাব আছে। যেহেতু এটি এখন দাঁড়িয়ে আছে, এটি কোনও মূল্য যোগ করে না এবং ডাউনভোট / মুছে ফেলা হচ্ছে তার পরিবর্তন দাঁড়ায়। দয়া করে কিছু ব্যাখ্যা যুক্ত করুন যা কী করে এবং এটি ওপি-র সমস্যার সমাধান কেন।
oɔɯǝɹ

0

আমিও এটি করার চেষ্টা করছিলাম, এবং ইউরির মন্তব্য এবং লিঙ্কপ্যাডের সাথে জগাখিচুড়ি থেকে আমি এটি পেয়েছি ..

নোট করুন যে আমার কাছে বই, অধ্যায়, পৃষ্ঠা নেই, আমার কাছে ব্যক্তি (বই), সংস্থা পার্সন (অধ্যায়) এবং সংস্থাগুলি (পৃষ্ঠা) রয়েছে

from person in Person
                           join companyPerson in CompanyPerson on person.Id equals companyPerson.PersonId into companyPersonGroups
                           from companyPerson in companyPersonGroups.DefaultIfEmpty()
                           select new
                           {
                               ContactPerson = person,
                               ContactCompany = companyPerson.Company
                           };

অথবা

Person
   .GroupJoin (
      CompanyPerson, 
      person => person.Id, 
      companyPerson => companyPerson.PersonId, 
      (person, companyPersonGroups) => 
         new  
         {
            person = person, 
            companyPersonGroups = companyPersonGroups
         }
   )
   .SelectMany (
      temp0 => temp0.companyPersonGroups.DefaultIfEmpty (), 
      (temp0, companyPerson) => 
         new  
         {
            ContactPerson = temp0.person, 
            ContactCompany = companyPerson.Company
         }
   )

রেফ সাইটটি আমি ব্যবহার করেছি: http://odetocode.com/blogs/scott/archive/2008/03/25/inner-outer-lets-all-join-together-with-linq.aspx

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.