সিলেক্ট এবং সিলেক্টম্যানির মধ্যে পার্থক্য


1071

আমি এর মধ্যে পার্থক্যটি সন্ধান করেছি Selectএবং SelectManyআমি কোনও উপযুক্ত উত্তর খুঁজে পাচ্ছি না। লিনকিউ টু এসকিউএল ব্যবহার করার সময় আমার পার্থক্যটি শিখতে হবে তবে আমি যা পেয়েছি তা হ'ল মানক অ্যারে উদাহরণ।

কেউ এসকিউএল উদাহরণের জন্য একটি লিনকিউ সরবরাহ করতে পারেন?


8
আপনি একটি ফাংশন সহ বা দুটি ফাংশন সহ সিলেক্টম্যানির কোডটি দেখতে পারেন রেফারেন্সসোর্স.মাইক্রোসফট
# সিস্টেমে.কোর

1
আপনি যদি কোটলিনের সাথে পরিচিত হন তবে এটি মানচিত্র ওরফে সি # নির্বাচন করুন এবং ফ্ল্যাটম্যাপ ওরফে সি # সিলেক্ট ম্যানি হিসাবে সংগ্রহের জন্য বেশ অনুরূপ বাস্তবায়ন রয়েছে। মূলত সংগ্রহের জন্য কোটলিন স্ট্যান্ডের লাইব্রেরি এক্সটেনশন ফাংশনগুলির সি # লিনক লাইব্রেরির সাথে সাদৃশ্য রয়েছে।
আর্সেনিয়াস

উত্তর:


1617

SelectManyতালিকাগুলির তালিকাসমূহ ফেরত পাঠানো প্রশ্নের সন্ধান করে। উদাহরণ স্বরূপ

public class PhoneNumber
{
    public string Number { get; set; }
}

public class Person
{
    public IEnumerable<PhoneNumber> PhoneNumbers { get; set; }
    public string Name { get; set; }
}

IEnumerable<Person> people = new List<Person>();

// Select gets a list of lists of phone numbers
IEnumerable<IEnumerable<PhoneNumber>> phoneLists = people.Select(p => p.PhoneNumbers);

// SelectMany flattens it to just a list of phone numbers.
IEnumerable<PhoneNumber> phoneNumbers = people.SelectMany(p => p.PhoneNumbers);

// And to include data from the parent in the result: 
// pass an expression to the second parameter (resultSelector) in the overload:
var directory = people
   .SelectMany(p => p.PhoneNumbers,
               (parent, child) => new { parent.Name, child.Number });

। নেট ফিডল লাইভ ডেমো


1
নেস্টেড শ্রেণিবদ্ধ কাঠামো সমতল করার জন্য সিলেক্টম্যানিকে নেস্টিং সম্পর্কিত সম্পর্কিত প্রশ্ন
রেড মটর

1
ResultSelector বোঝার জন্য আরো নীচের লিঙ্কটি সাহায্য করে blogs.interknowlogy.com/2008/10/10/...
জমির

পিতামাতার ফলাফল সহ আরও একটি ডেমো: ডটনেটফিডেল.এন.এফএলসিডিসিসি
ইভজিনি কোসজাকভ

ফিডাল লিঙ্কের জন্য আপনাকে ধন্যবাদ!
এয়ারিন

197

অনেকগুলি নির্বাচন করা এসকিউএল-এ ক্রস জয়েন অপারেশনের মতো যেখানে এটি ক্রস পণ্য গ্রহণ করে।
উদাহরণস্বরূপ যদি আমাদের থাকে

Set A={a,b,c}
Set B={x,y}

নীচের সেটটি পেতে অনেকগুলি ব্যবহার করুন

{ (x,a) , (x,b) , (x,c) , (y,a) , (y,b) , (y,c) }

দ্রষ্টব্য যে এখানে আমরা সেট এ এবং সেট বি এর উপাদানগুলি থেকে তৈরি করা সম্ভব সমস্ত সংমিশ্রণগুলি নিয়েছি take

আপনি চেষ্টা করতে পারেন এমন একটি লিনকিউ উদাহরণ এখানে

List<string> animals = new List<string>() { "cat", "dog", "donkey" };
List<int> number = new List<int>() { 10, 20 };

var mix = number.SelectMany(num => animals, (n, a) => new { n, a });

মিশ্রণের মতো সমতল কাঠামোতে নিম্নলিখিত উপাদান থাকবে

{(10,cat), (10,dog), (10,donkey), (20,cat), (20,dog), (20,donkey)}

4
আমি জানি এটি পুরানো, তবে আমি এর জন্য আপনাকে ধন্যবাদ জানাতে চেয়েছিলাম, এটি আমাকে অনেক রক্ষা করেছে! :) এটা খুবই ঐ কোড একটি রেফারেন্স আছে উপযোগী হতে পারে: stackoverflow.com/questions/3479980/... চিয়ার্স!
ব্যবহারকারী 3439065

4
সিলেক্টম্যানি তেমন ব্যবহার করতে হবে না। এটিতে কেবল একটি ফাংশন নেওয়ার একটি বিকল্প রয়েছে।
বারলপ

2
আমি জানিনা যদি এটা ঠিক বলতে চাই যে এই হল কিভাবে SelectMany হয় । বরং এটি এমন একটি উপায় যা SelectManyব্যবহার করা যেতে পারে তবে এটি ব্যবহার করার স্বাভাবিক উপায় নয়।
ডেভ কজিনিউ

1
এটি আমার বুঝতে সহজ উত্তর ছিল।
চেইম এলিয়াহ

আপনি যদি Whereসিলেক্টম্যানির পরেও শর্তটি প্রদর্শন করেন তবে ভাল হবে
নিতিন কেটি

126

এখানে চিত্র বর্ণনা লিখুন

var players = db.SoccerTeams.Where(c => c.Country == "Spain")
                            .SelectMany(c => c.players);

foreach(var player in players)
{
    Console.WriteLine(player.LastName);
}
  1. ডি জিয়া
  2. আলবা
  3. পঁজর
  4. উদ্যানবাটি
  5. Busquets

...


9
দুর্দান্ত উদাহরণ ডেটা
ben_mj 7'19

1
আপনি এই উত্তরটি পূরণ করতে
হ্যারি

73

SelectMany()আপনাকে একটি বহুমাত্রিক ক্রমটি এমনভাবে ভেঙে ফেলতে দেয় যা অন্যথায় দ্বিতীয় Select()বা লুপের প্রয়োজন হয়।

এই ব্লগ পোস্টে আরও বিশদ ।


কিন্তু প্রথম এক রিটার্ন শিশুদের প্রকারের দ্বিতীয় উদাহরণ পিতা-মাতার দ্বিতীয় উদাহরণ? আসলে আমি কিছুটা বিভ্রান্ত হয়ে পড়েছি, আপনি কি আরও কিছুটা খুলবেন?
তারিক

অন্যদিকে, আসলে। দ্বিতীয়টি গণনার সংখ্যাক্রমকে পুরোপুরি সমতল করবে, যাতে আপনি বাচ্চাদের ফিরে পেতে পারেন। আমি যোগ করা লিঙ্কটিতে নিবন্ধটি চেষ্টা করুন, দেখুন এটি সাহায্য করে কিনা।
মাইকেল পেট্রোটা

প্রথমটি আইনী বলে মনে হয় না। আমি মনে করি পোস্টারটি নিজেকে বিভ্রান্ত করেছে। দ্বিতীয়টি পিতামাতার একটি অগণিত ফিরিয়ে দেয়।
এমকিপিপি

ধন্যবাদ, আসলেই হ্যাঁ উদাহরণগুলি ছিল বিভ্রান্তিকর :) তবে আমাকে সাহায্য করার চেষ্টা করার জন্য আবারও ধন্যবাদ।
তারিক

37

এখানে বেশ কয়েকটি ওভারলোড রয়েছে SelectMany। এর মধ্যে একটি আপনাকে হায়ারার্কি অতিক্রম করার সময় পিতামাতার এবং সন্তানের মধ্যে যে কোনও সম্পর্কের সন্ধান করতে দেয়।

উদাহরণ : ধরুন আপনি নিম্নলিখিত গঠন আছে: League -> Teams -> Player

আপনি সহজেই খেলোয়াড়দের সমতল সংগ্রহ ফিরিয়ে দিতে পারেন। তবে আপনি খেলোয়াড়ের অংশ হিসাবে দলের কোনও রেফারেন্স হারাতে পারেন।

ভাগ্যক্রমে এই ধরনের কাজের জন্য একটি ওভারলোড রয়েছে:

var teamsAndTheirLeagues = 
         from helper in leagues.SelectMany
               ( l => l.Teams
                 , ( league, team ) => new { league, team } )
                      where helper.team.Players.Count > 2 
                           && helper.league.Teams.Count < 10
                           select new 
                                  { LeagueID = helper.league.ID
                                    , Team = helper.team 
                                   };

পূর্ববর্তী উদাহরণটি ড্যানের আইকে ব্লগ থেকে নেওয়া হয়েছে । আমি আপনাকে দৃ strongly়ভাবে সুপারিশ করছি এটি একবার দেখুন।


19

আমি SelectManyএকটি যোগদান শর্টকাটের মতো কাজ করতে বুঝতে পারি ।

তাই আপনি যা করতে পারেন:

var orders = customers
             .Where(c => c.CustomerName == "Acme")
             .SelectMany(c => c.Orders);

প্রদত্ত উদাহরণ কাজ করে তবে সিলেক্টম্যানি একটি যোগদানের মতো ঠিক কাজ করে না। একটি জোড় মূল টেবিলের যে কোনও ক্ষেত্রের সাথে যুক্ত সারণির যে কোনও ক্ষেত্রকে "ব্যবহার" করতে দেয়। তবে এখানে আপনাকে মূল টেবিলের সাথে সংযুক্ত তালিকার একটি অবজেক্ট নির্দিষ্ট করতে হবে। উদাহরণস্বরূপ, .SelectMany(c => new {c.CompanyName, c.Orders.ShippedDate});কাজ করবে না। সিলেক্টম্যানি তালিকার তালিকাটিকে আরও চাটুকার করে তুলছে - এবং ফলাফলের জন্য থাকা তালিকাগুলির মধ্যে আপনি যে কোনও একটি (তবে একবারে কেবলমাত্র একটি) বেছে নিতে পারেন। তুলনার জন্য: লিঙ্কে অভ্যন্তরীণ যোগদান
ম্যাট

13

নির্বাচন হ'ল উত্স উপাদান থেকে ফলাফলের উপাদানগুলিতে একটি সাধারণ এক থেকে এক প্রক্ষেপণ। নির্বাচন - অনেকগুলি ব্যবহৃত হয় যখন কোনও ক্যোয়ারী এক্সপ্রেশনে ক্লজগুলি থেকে একাধিক থাকে: মূল অনুক্রমের প্রতিটি উপাদান একটি নতুন ক্রম উত্পন্ন করতে ব্যবহৃত হয়।


7

কিছু সিলেক্টম্যানির প্রয়োজনীয় নাও হতে পারে। 2 টি প্রশ্নের নীচে একই ফলাফল দেয়।

Customers.Where(c=>c.Name=="Tom").SelectMany(c=>c.Orders)

Orders.Where(o=>o.Customer.Name=="Tom")

1-থেকে-বহু সম্পর্কের জন্য,

  1. যদি "1" থেকে শুরু করেন, সিলেক্টম্যানির প্রয়োজন হয়, এটি অনেকগুলিকে সমতল করে তোলে।
  2. যদি "অনেকগুলি" থেকে শুরু হয় তবে সিলেক্টম্যানির প্রয়োজন হয় না। ( এখনও "1" থেকে ফিল্টার করতে সক্ষম হোন , এটি স্ট্যান্ডার্ড জোয়ার কোয়েরির চেয়েও সহজ)

from o in Orders
join c in Customers on o.CustomerID equals c.ID
where c.Name == "Tom"
select o

4

খুব বেশি প্রযুক্তিগত না হয়ে - অনেকগুলি সংস্থার সাথে অনেকগুলি ব্যবহারকারীর সাথে ডাটাবেস:

var orgId = "123456789";

var userList1 = db.Organizations
                   .Where(a => a.OrganizationId == orgId)
                   .SelectMany(a => a.Users)
                   .ToList();

var userList2 = db.Users
                   .Where(a => a.OrganizationId == orgId)
                   .ToList();

উভয়ই নির্বাচিত সংস্থার জন্য একই অ্যাপ্লিকেশন ব্যবহারকারী তালিকাটি ফেরত দেয়

সংস্থা থেকে ব্যবহারকারীদের মধ্যে প্রথম "প্রকল্পগুলি", দ্বিতীয়টি সরাসরি ব্যবহারকারীদের সারণীতে প্রশ্ন করে।


3

যখন ক্যোয়ারী একটি স্ট্রিং (চরের অ্যারে) ফেরত দেয় তখন এটি আরও স্পষ্ট:

উদাহরণস্বরূপ, যদি 'ফল' তালিকায় 'আপেল' থাকে

'নির্বাচন করুন' স্ট্রিংটি প্রদান করে:

Fruits.Select(s=>s) 

[0]: "apple"

'সিলেক্টম্যানি' স্ট্রিংকে ফ্ল্যাট করে:

Fruits.SelectMany(s=>s)

[0]: 97  'a'
[1]: 112 'p'
[2]: 112 'p'
[3]: 108 'l'
[4]: 101 'e'

2

কেবলমাত্র বিকল্প বিকল্পের জন্য যা সেখানে কিছু কার্যকরী প্রোগ্রামারকে সহায়তা করতে পারে:

  • Select হয় map
  • SelectManyহয় bind(বা flatMapআপনার স্কালার / কোটলিনদের জন্য)

2

এই উদাহরণ বিবেচনা করুন:

        var array = new string[2]
        {
            "I like what I like",
            "I like what you like"
        };
        //query1 returns two elements sth like this:
        //fisrt element would be array[5]  :[0] = "I" "like" "what" "I" "like"
        //second element would be array[5] :[1] = "I" "like" "what" "you" "like"
        IEnumerable<string[]> query1 = array.Select(s => s.Split(' ')).Distinct();

        //query2 return back flat result sth like this :
        // "I" "like" "what" "you"
        IEnumerable<string> query2 = array.SelectMany(s => s.Split(' ')).Distinct();

সুতরাং আপনি যেমন দেখেন যে "I" বা "লাইক" এর মতো সদৃশ মানগুলি ক্যুয়ারি 2 থেকে অপসারণ করা হয়েছে কারণ "সিলেক্টম্যানি" একাধিক সিকোয়েন্স জুড়ে সমতল এবং প্রকল্পগুলি। কিন্তু ক্যুয়ারি 1 স্ট্রিং অ্যারেগুলির ক্রম প্রদান করে। এবং যেহেতু ক্যোয়ার 1 এ (প্রথম এবং দ্বিতীয় উপাদান) দুটি পৃথক অ্যারে রয়েছে তাই কোনও কিছুই সরানো হবে না।


সম্ভবত ভাল এখন শেষ এবং রাজ্য এ .Distinct () অন্তর্ভুক্ত আউটপুট "আমি" "মত" "কি" "আমি" "মত" "আমি" "মত" কি "" আপনি "" মত ""
অধ্যাপক

1

সাব অ্যারে অবজেক্টের ডেটা সংগ্রহ করার জন্য কীভাবে সিলেক্টম্যানি + নির্বাচন ব্যবহার করা যেতে পারে তার আরও একটি উদাহরণ।

ধরুন আমাদের কাছে তাদের ফোন রয়েছে ব্যবহারকারীরা:

class Phone { 
    public string BasePart = "555-xxx-xxx"; 
}

class User { 
    public string Name = "Xxxxx";
    public List<Phone> Phones; 
}

এখন আমাদের সকল ব্যবহারকারীর সমস্ত ফোনের বেসপার্ট নির্বাচন করতে হবে:

var usersArray = new List<User>(); // array of arrays
List<string> allBaseParts = usersArray.SelectMany(ua => ua.Phones).Select(p => p.BasePart).ToList();

আপনি কোনটি ভাল বলে মনে করেন? ইতি বাusersArray.SelectMany(ua => ua.Phones.Select(p => p.BasePart))
মাইকেল সেরা

-1

এখানে পরীক্ষার জন্য একটি প্রাথমিক ছোট সংগ্রহ সহ একটি কোড উদাহরণ রয়েছে:

class Program
{
    static void Main(string[] args)
    {
        List<Order> orders = new List<Order>
        {
            new Order
            {
                OrderID = "orderID1",
                OrderLines = new List<OrderLine>
                {
                    new OrderLine
                    {
                        ProductSKU = "SKU1",
                        Quantity = 1
                    },
                    new OrderLine
                    {
                        ProductSKU = "SKU2",
                        Quantity = 2
                    },
                    new OrderLine
                    {
                        ProductSKU = "SKU3",
                        Quantity = 3
                    }
                }
            },
            new Order
            {
                OrderID = "orderID2",
                OrderLines = new List<OrderLine>
                {
                    new OrderLine
                    {
                        ProductSKU = "SKU4",
                        Quantity = 4
                    },
                    new OrderLine
                    {
                        ProductSKU = "SKU5",
                        Quantity = 5
                    }
                }
            }
        };

        //required result is the list of all SKUs in orders
        List<string> allSKUs = new List<string>();

        //With Select case 2 foreach loops are required
        var flattenedOrdersLinesSelectCase = orders.Select(o => o.OrderLines);
        foreach (var flattenedOrderLine in flattenedOrdersLinesSelectCase)
        {
            foreach (OrderLine orderLine in flattenedOrderLine)
            {
                allSKUs.Add(orderLine.ProductSKU);
            }
        }

        //With SelectMany case only one foreach loop is required
        allSKUs = new List<string>();
        var flattenedOrdersLinesSelectManyCase = orders.SelectMany(o => o.OrderLines);
        foreach (var flattenedOrderLine in flattenedOrdersLinesSelectManyCase)
        {
            allSKUs.Add(flattenedOrderLine.ProductSKU);
        }

       //If the required result is flattened list which has OrderID, ProductSKU and Quantity,
       //SelectMany with selector is very helpful to get the required result
       //and allows avoiding own For loops what according to my experience do code faster when
       // hundreds of thousands of data rows must be operated
        List<OrderLineForReport> ordersLinesForReport = (List<OrderLineForReport>)orders.SelectMany(o => o.OrderLines,
            (o, ol) => new OrderLineForReport
            {
                OrderID = o.OrderID,
                ProductSKU = ol.ProductSKU,
                Quantity = ol.Quantity
            }).ToList();
    }
}
class Order
{
    public string OrderID { get; set; }
    public List<OrderLine> OrderLines { get; set; }
}
class OrderLine
{
    public string ProductSKU { get; set; }
    public int Quantity { get; set; }
}
class OrderLineForReport
{
    public string OrderID { get; set; }
    public string ProductSKU { get; set; }
    public int Quantity { get; set; }
}

-2

SelectManyএকটি ডাউন পদ্ধতি দরজায় কড়া নাড়লেই IEnumerable<IEnumerable<T>>একটি মধ্যে IEnumerable<T>, কমিউনিজম মত, প্রতিটি উপাদান একই পদ্ধতিতে ভদ্র হয় (একটি মূঢ় লোক একটি কি genious এক একই অধিকার আছে)।

var words = new [] { "a,b,c", "d,e", "f" };
var splitAndCombine = words.SelectMany(x => x.Split(','));
// returns { "a", "b", "c", "d", "e", "f" }

-5

আমি মনে করি এটি বোঝার সেরা উপায়।

            var query =
            Enumerable
                .Range(1, 10)
                .SelectMany(ints => Enumerable.Range(1, 10), (a, b) => $"{a} * {b} = {a * b}")
                .ToArray();

        Console.WriteLine(string.Join(Environment.NewLine, query));

        Console.Read();

গুণক সারণীর উদাহরণ।


4
কেবলমাত্র "সেরা" এর অর্থ নাটকীয়ভাবে পরিবর্তিত হলে।
ওয়াহিদ আমিরি

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