C# LINQ (Language Integrated Query) — ఆధునిక డేటా ప్రాసెసింగ్ పవర్‌హౌస్

⚡ Modern C# 12 / .NET 8 LTS 📖 Chapter 19 of 20 🚀 Phase 05: అడ్వాన్స్‌డ్ C#, LINQ & ప్రాజెక్ట్ 📅 2026 Academic Edition
📌 Covered in this chapter: LINQ విప్లవం · Query Syntax vs Method Syntax (Fluent API) · Deferred Execution (వాయిదా అమలు) vs Immediate Execution · ToList, ToArray, ToDictionary · Where & Select ప్రొజెక్షన్ · OrderBy & ThenBy సార్టింగ్ · Count, Sum, Average, Min, Max అగ్రిగేషన్స్ · FirstOrDefault vs SingleOrDefault భద్రత · Any vs Count() > 0 పెర్ఫార్మెన్స్ · GroupBy వర్గీకరణ · Skip & Take పేజినేషన్ · ఈ-కామర్స్ సేల్స్ అనలిటిక్స్ ప్రాజెక్ట్ · 5 ఇంటరాక్టివ్ క్విజ్ ప్రశ్నలు

C# లో అత్యంత ప్రియమైన ఫీచర్: LINQ (Language Integrated Query)! ⚡

ఒకప్పుడు ప్రోగ్రామర్లు ఒక లిస్ట్‌లోని డేటాను ఫిల్టర్ చేయాలన్నా, సార్ట్ చేయాలన్నా, లేదా గ్రూప్ చేయాలన్నా — నాలుగైదు నెస్టెడ్ for లూప్‌లు, డజన్ల కొద్దీ తాత్కాలిక వేరియబుల్స్, గజిబిజి కండిషన్లు రాయాల్సి వచ్చేది. పైగా మెమరీ ఆబ్జెక్టులకు ఒక కోడ్, SQL డేటాబేస్‌కు SQL క్వెరీలు, XML కి ఇంకో కోడ్ రాయాల్సి వచ్చేది.

ఈ గందరగోళానికి చరమగీతం పాడుతూ మైక్రోసాఫ్ట్ C# లోకి ప్రవేశపెట్టిన అద్భుతమైన ఆవిష్కరణే LINQ (Language Integrated Query). మీ డేటా RAM లోని List<T> లో ఉన్నా, SQL సర్వర్ లో ఉన్నా, లేదా క్లౌడ్ JSON లో ఉన్నా సరే — ఒకే ఒక శక్తివంతమైన, చదవడానికి అత్యంత సులభమైన ఇంగ్లీష్ లాంటి డిక్లరేటివ్ సింటాక్స్‌తో క్వెరీ చేయవచ్చు! LINQ అంతర్గత మెకానిక్స్ అయిన Deferred Execution, ఫ్లూయెంట్ ఆపరేటర్లు, మరియు బిగ్-డేటా అనలిటిక్స్ ప్రాజెక్ట్‌ను ఈ అధ్యాయంలో సమగ్రంగా నేర్చుకుందాం!

1 🌍 LINQ అంటే ఏమిటి? డేటా ప్రాసెసింగ్‌లో విప్లవం

LINQ (Language Integrated Query) అనేది C# ప్రోగ్రామింగ్ లాంగ్వేజ్‌లోనే నేరుగా విలీనం చేయబడిన ఒక క్వెరీ టెక్నాలజీ.

LINQ అందించే ప్రధాన ప్రయోజనాలు:

  • ఏకీకృత సింటాక్స్ (Uniform Syntax): ఆబ్జెక్ట్స్ (LINQ to Objects), డేటాబేస్ (Entity Framework / LINQ to Entities), XML, JSON అన్నింటికీ ఒకే తరహా కోడ్.
  • కంపైల్-టైమ్ టైప్ సేఫ్టీ (Type Safety): SQL లో టేబుల్ లేదా కాలమ్ పేరు తప్పుగా రాస్తే రన్‌టైమ్ లో మాత్రమే తెలుస్తుంది. కానీ LINQ లో మీరు కాలమ్ పేరు తప్పుగా రాస్తే కంపైలర్ అక్కడికక్కడే ఎర్రర్ చూపిస్తుంది!
  • ఇంటెల్లిసెన్స్ (IntelliSense) సపోర్ట్: విజువల్ స్టూడియో లేదా VS Code లో డాట్ (.) పెట్టగానే అన్ని ఫీల్డ్స్, మెథడ్స్ ఆటోమేటిక్‌గా కనిపిస్తాయి.

2 ✍️ Query Syntax vs Method Syntax (Fluent API)

LINQ క్వెరీలను రెండు విధాలుగా రాయవచ్చు:

csharp · Query Syntax vs Method Syntax
List numbers = new() { 12, 45, 68, 23, 90, 34, 71, 18 };

// 1. Query Syntax (SQL లాంటి శైలి - from ... where ... select)
var queryResult = from n in numbers
                  where n > 40
                  orderby n descending
                  select n;

// 2. Method Syntax (Fluent Extension Methods - ప్రొఫెషనల్స్ ఎక్కువగా వాడే శైలి!)
var methodResult = numbers.Where(n => n > 40)
                          .OrderByDescending(n => n);

// రెండింటి ఫలితం ఒకటే!
Console.WriteLine(string.Join(", ", methodResult)); // 90, 71, 68, 45

గమనిక: C# కంపైలర్ Query Syntax లో రాసిన కోడ్‌ను కూడా అంతర్గతంగా Method Syntax లోకే మారుస్తుంది. అందువల్ల ఆధునిక సాఫ్ట్‌వేర్ సంస్థలలో లాంబ్డా ఆధారిత Method Syntax (Fluent API) నే ప్రామాణికంగా ఉపయోగిస్తారు.

3 ⏳ Deferred Execution (వాయిదా అమలు) vs Immediate Execution

ఇది LINQ లో అత్యంత లోతైన మరియు ఇంటర్వ్యూలలో అత్యధికంగా పరీక్షించే కాన్సెప్ట్!

Deferred Execution (వాయిదా అమలు): మీరు var q = list.Where(...) అని రాసినప్పుడు, ఆ క్వెరీ వెంటనే ఎగ్జిక్యూట్ అవ్వదు! అది కేవలం ఒక ఎగ్జిక్యూషన్ ప్లాన్ (Blueprint) మాత్రమే. ఆ డేటా నిజంగా ఎప్పుడు రన్ అవుతుందంటే — మీరు ఆ క్వెరీపై foreach లూప్ తిప్పినప్పుడు లేదా ToList() పిలిచినప్పుడు మాత్రమే!
csharp · Proof of Deferred Execution
List names = new() { "రాము", "గోపాల్" };

// క్వెరీ డిక్లేర్ చేశాం - కానీ ఇంకా రన్ అవ్వలేదు!
var query = names.Where(n => n.Length >= 4);

// క్వెరీ డిక్లేర్ చేసిన తర్వాత లిస్ట్‌లోకి కొత్త పేరు చేర్చాం!
names.Add("శ్రీనివాస్");

// ఇప్పుడు లూప్ తిరుగుతున్నప్పుడు మాత్రమే అసలైన క్వెరీ రన్ అవుతుంది!
foreach (var name in query)
{
    Console.WriteLine(name);
}
// అవుట్‌పుట్: శ్రీనివాస్ (తర్వాత చేర్చిన పేరు కూడా వచ్చింది! ఇదే Deferred Execution!)

4 ⚡ Immediate Execution ఆపరేటర్లు: `ToList()`, `ToArray()`, `ToDictionary()`

ఒకవేళ మీరు క్వెరీ ఫలితాన్ని తక్షణమే మెమరీలో ఒక స్నాప్‌షాట్ లాగా భద్రపరచాలనుకుంటే (తర్వాత ఒరిజినల్ లిస్ట్ మారినా ఈ ఫలితం మారకూడదనుకుంటే), Immediate Execution ఆపరేటర్లను పిలవాలి:

  • .ToList(): ఫలితాన్ని తక్షణమే List<T> గా మారుస్తుంది.
  • .ToArray(): ఫలితాన్ని ఫిక్స్‌డ్ సైజ్ అర్రేగా మారుస్తుంది.
  • .ToDictionary(k => k.Id): కీ-వాల్యూ డిక్షనరీగా మారుస్తుంది.

5 🔍 ఫిల్టరింగ్ & ప్రొజెక్షన్: `Where` మరియు `Select`

LINQ లో ప్రతిరోజూ అత్యధికంగా ఉపయోగించే రెండు ప్రాథమిక స్తంభాలు:

  1. Where(predicate): ఒక షరతును ఇచ్చి, కేవలం ఆ షరతు నెరవేరిన రికార్డులను మాత్రమే ఫిల్టర్ చేయడం.
  2. Select(transform): డేటాను ప్రొజెక్షన్ చేయడం. అంటే ఉన్న ఆబ్జెక్ట్ నుండి కేవలం కావాల్సిన కాలమ్స్‌ను మాత్రమే ఎంపిక చేయడం లేదా కొత్త రూపంలోకి మార్చడం (DTO Mapping).
csharp · Where and Select Projection
public record Product(string Title, decimal Price, string Category);

List products = new()
{
    new Product("స్మార్ట్‌ఫోన్", 25000m, "ఎలక్ట్రానిక్స్"),
    new Product("కాటన్ షర్ట్", 1200m, "ఫ్యాషన్"),
    new Product("ల్యాప్‌టాప్", 75000m, "ఎలక్ట్రానిక్స్"),
    new Product("రన్నింగ్ షూస్", 3500m, "ఫ్యాషన్")
};

// ఎలక్ట్రానిక్స్ మాత్రమే ఫిల్టర్ చేసి, కేవలం టైటిల్ మరియు GST ధరను ప్రొజెక్ట్ చేయడం
var electronicsDto = products
    .Where(p => p.Category == "ఎలక్ట్రానిక్స్")
    .Select(p => new 
    {
        Item = p.Title,
        FinalPriceWithGst = p.Price * 1.18m
    })
    .ToList();

foreach (var item in electronicsDto)
{
    Console.WriteLine($"వస్తువు: {item.Item} | జీఎస్టీ ధర: ₹{item.FinalPriceWithGst:N2}");
}

6 📶 సార్టింగ్: `OrderBy`, `OrderByDescending`, `ThenBy`

డేటాను క్రమపద్ధతిలో అమర్చడానికి (Sorting):

  • OrderBy(x => x.Field): ఆరోహణ క్రమం (Ascending order - A to Z, చిన్న నుండి పెద్దది).
  • OrderByDescending(x => x.Field): అవరోహణ క్రమం (Descending order - Z to A, పెద్ద నుండి చిన్నది).
  • ThenBy(x => x.SecondaryField): మొదటి కాలమ్ సమానమైనప్పుడు, రెండో కాలమ్ ఆధారంగా సార్టింగ్ (Multi-level sorting).
csharp · Multi-Level Sorting with OrderBy & ThenBy
var sortedList = products
    .OrderBy(p => p.Category)           // మొదట కేటగిరీ ప్రకారం A-Z
    .ThenByDescending(p => p.Price);    // కేటగిరీ సమానమైతే ధర ప్రకారం ఎక్కువ నుండి తక్కువకు

7 🧮 అగ్రిగేషన్ ఆపరేటర్లు: `Count`, `Sum`, `Average`, `Min`, `Max`

కలెక్షన్‌లోని డేటాపై గణాంకాలు (Statistical metrics) లెక్కించడానికి:

csharp · Statistical Aggregations
decimal totalInventoryValue = products.Sum(p => p.Price);
decimal avgPrice = products.Average(p => p.Price);
decimal maxPrice = products.Max(p => p.Price);
int affordableCount = products.Count(p => p.Price < 5000m);

Console.WriteLine($"మొత్తం ఇన్వెంటరీ విలువ: ₹{totalInventoryValue:N2}");
Console.WriteLine($"సగటు ధర: ₹{avgPrice:N2}");
Console.WriteLine($"గరిష్ట ధర: ₹{maxPrice:N2}");
Console.WriteLine($"బడ్జెట్ వస్తువులు (<₹5k): {affordableCount}");

8 🎯 ఎలిమెంట్ ఆపరేటర్లు: `First`, `FirstOrDefault`, `Single`, `SingleOrDefault`

కలెక్షన్ నుండి ఒక నిర్దిష్ట సింగిల్ ఎలిమెంట్‌ను ఎంచుకోవడానికి ఈ ఆపరేటర్లు వాడతాం:

మెథడ్ ఎలిమెంట్ దొరకకపోతే? బహుళ ఎలిమెంట్లు దొరికితే? ఎప్పుడు వాడాలి?
First() ❌ InvalidOperationException మొదటి ఎలిమెంట్ తీసుకుంటుంది కనీసం ఒక్కటైనా ఖచ్చితంగా ఉంటుందని నమ్మకం ఉన్నప్పుడు
FirstOrDefault() ✅ null లేదా డీఫాల్ట్ విలువ ఇస్తుంది మొదటి ఎలిమెంట్ తీసుకుంటుంది అత్యంత సురక్షితమైనది (90% ప్రొడక్షన్‌లో ఇదే వాడాలి)
Single() ❌ InvalidOperationException ❌ InvalidOperationException ఖచ్చితంగా ఒక్కటే ఉండాలి (ఉదా: Primary Key ID)
SingleOrDefault() ✅ null ఇస్తుంది ❌ InvalidOperationException 0 లేదా 1 మాత్రమే ఉండాలి అనుకున్నప్పుడు

9 ⚡ క్వాంటిఫైయర్లు: `Any` vs `Count() > 0` — సీనియర్ పెర్ఫార్మెన్స్ టిప్!

ఒక లిస్ట్‌లో డేటా ఉందో లేదో సరిచూడటానికి రూకీలు list.Count() > 0 రాస్తారు. కానీ సీనియర్ ఇంజనీర్లు ఎల్లప్పుడూ list.Any() రాస్తారు!

🚀 ఎందుకు Any() వేల రెట్లు వేగవంతమైనది?

• Count() మొత్తం 10 లక్షల రికార్డులను లెక్కిస్తూ చివరి వరకు వెళ్తుంది (O(N) Complexity).
• Any() మొదటి రికార్డు కనిపించగానే తక్షణమే true రిటర్న్ చేసి బయటకు వచ్చేస్తుంది (O(1) Early Exit)!

10 🗂️ గ్రూపింగ్: `GroupBy` ద్వారా వర్గీకరణ

డేటాను ఏదైనా నిర్దిష్ట కేటగిరీ లేదా డిపార్ట్‌మెంట్ ప్రకారం వర్గీకరించడానికి GroupBy వాడతాం:

csharp · GroupBy in Action
var groupedByCategory = products.GroupBy(p => p.Category);

foreach (var group in groupedByCategory)
{
    Console.WriteLine($"\n📁 కేటగిరీ: {group.Key} ({group.Count()} వస్తువులు)");
    foreach (var item in group)
    {
        Console.WriteLine($"   • {item.Title} - ₹{item.Price:N2}");
    }
}

11 📄 పేజినేషన్ (Pagination): `Skip` మరియు `Take`

వెబ్ అప్లికేషన్లలో 10,000 రికార్డులను ఒకేసారి యూజర్‌కు చూపిస్తే బ్రౌజర్ హ్యాంగ్ అవుతుంది. ఒక్కో పేజీకి 10 రికార్డుల చొప్పున పేజినేషన్ చేయడానికి Skip మరియు Take వాడతాం:

csharp · Enterprise Pagination Formula
int pageNumber = 2; // రెండవ పేజీ
int pageSize = 10;   // పేజీకి 10 రికార్డులు

// బంగారు పేజినేషన్ సూత్రం:
var pageRecords = allCustomers
    .Skip((pageNumber - 1) * pageSize) // మొదటి 10 ని స్కిప్ చేస్తుంది
    .Take(pageSize)                    // తర్వాత 10 ని తీసుకుంటుంది
    .ToList();

12 📊 రియల్-వరల్డ్ ప్రాజెక్ట్ — ఎంటర్‌ప్రైజ్ ఈ-కామర్స్ సేల్స్ అనలిటిక్స్ ఇంజిన్

ఈ అధ్యాయంలో నేర్చుకున్న LINQ Where, Select, OrderBy, GroupBy, Sum, Any, FirstOrDefault, మరియు Skip/Take లన్నింటినీ ఉపయోగించి ఒక పూర్తి స్థాయి ఈ-కామర్స్ బిగ్-డేటా అనలిటిక్స్ ఇంజిన్ (Sales Analytics Engine v1.0) నిర్మిద్దాం.

csharp · Enterprise E-Commerce Analytics Engine
using System;
using System.Collections.Generic;
using System.Linq;

Console.OutputEncoding = System.Text.Encoding.UTF8;

Console.WriteLine("=================================================");
Console.WriteLine("📊 మన షాప్ - ఎంటర్‌ప్రైజ్ సేల్స్ అనలిటిక్స్ ఇంజిన్ (LINQ)");
Console.WriteLine("=================================================\n");

// డొమైన్ మోడల్స్ (Records)
public record SaleRecord(string OrderId, string CustomerName, string City, string Category, decimal Amount, DateTime Date);

List sales = new()
{
    new("ORD-101", "శ్రీధర్ వర్మ", "హైదరాబాద్", "ల్యాప్‌టాప్స్", 85000m, DateTime.Now.AddDays(-2)),
    new("ORD-102", "అనిత రావు", "విజయవాడ", "స్మార్ట్‌ఫోన్స్", 28000m, DateTime.Now.AddDays(-5)),
    new("ORD-103", "రాజేష్ నాయుడు", "హైదరాబాద్", "యాక్సెసరీస్", 2500m, DateTime.Now.AddDays(-1)),
    new("ORD-104", "భవాని శంకర్", "విశాఖపట్నం", "ల్యాప్‌టాప్స్", 92000m, DateTime.Now.AddDays(-3)),
    new("ORD-105", "సంధ్యా రాణి", "హైదరాబాద్", "స్మార్ట్‌ఫోన్స్", 45000m, DateTime.Now.AddDays(-4)),
    new("ORD-106", "కిషోర్ కుమార్", "విజయవాడ", "యాక్సెసరీస్", 1800m, DateTime.Now.AddDays(-6)),
    new("ORD-107", "శ్రీవాత్సవ", "విశాఖపట్నం", "స్మార్ట్‌ఫోన్స్", 32000m, DateTime.Now.AddDays(-2)),
    new("ORD-108", "సురేష్ కొణిదెల", "హైదరాబాద్", "ల్యాప్‌టాప్స్", 115000m, DateTime.Now.AddDays(-1))
};

// 1. స్థూల గణాంకాలు (Aggregations)
decimal grossSales = sales.Sum(s => s.Amount);
decimal avgTicketSize = sales.Average(s => s.Amount);
decimal maxOrderVal = sales.Max(s => s.Amount);

Console.WriteLine($"💰 మొత్తం అమ్మకాల ఆదాయం : ₹{grossSales:N2}");
Console.WriteLine($"📈 సగటు ఆర్డర్ పరిమాణం : ₹{avgTicketSize:N2}");
Console.WriteLine($"🏆 అత్యధిక సింగిల్ ఆర్డర్: ₹{maxOrderVal:N2}\n");

// 2. కేటగిరీల వారీగా అమ్మకాల విశ్లేషణ (GroupBy & Sum)
Console.WriteLine("📁 కేటగిరీల వారీగా అమ్మకాల పనితీరు:");
var categoryReport = sales
    .GroupBy(s => s.Category)
    .Select(g => new
    {
        Category = g.Key,
        TotalRevenue = g.Sum(x => x.Amount),
        OrdersCount = g.Count(),
        AvgPerOrder = g.Average(x => x.Amount)
    })
    .OrderByDescending(r => r.TotalRevenue);

foreach (var row in categoryReport)
{
    Console.WriteLine($"   • {row.Category,-14} | మొత్తం: ₹{row.TotalRevenue,10:N2} | ఆర్డర్లు: {row.OrdersCount} | సగటు: ₹{row.AvgPerOrder:N2}");
}

// 3. నగరాల వారీగా ఆర్డర్ల లెక్కింపు (City-wise Sales)
Console.WriteLine("\n🏙️ నగరాల వారీగా రెవెన్యూ:");
var cityReport = sales
    .GroupBy(s => s.City)
    .Select(g => new { City = g.Key, Total = g.Sum(x => x.Amount) })
    .OrderByDescending(c => c.Total);

foreach (var c in cityReport)
{
    Console.WriteLine($"   • {c.City,-12}: ₹{c.Total:N2}");
}

// 4. హై-వాల్యూ కస్టమర్లు (VIP Orders > ₹50,000)
Console.WriteLine("\n⭐ VIP హై-వాల్యూ ఆర్డర్లు (> ₹50,000):");
var vipOrders = sales
    .Where(s => s.Amount >= 50000m)
    .OrderByDescending(s => s.Amount)
    .Select(s => $"{s.CustomerName} ({s.City}) -> ₹{s.Amount:N2} [{s.Category}]");

foreach (var vip in vipOrders)
{
    Console.WriteLine($"   💎 {vip}");
}

// 5. పేజినేషన్ సిమ్యులేషన్ (Page 1: Top 3 Sales)
Console.WriteLine("\n📄 పేజినేషన్ డెమో (Top 3 అమ్మకాలు - Page 1):");
var top3 = sales.OrderByDescending(s => s.Amount).Take(3);
foreach (var s in top3)
{
    Console.WriteLine($"   [{s.OrderId}] {s.CustomerName} - ₹{s.Amount:N2}");
}

Console.WriteLine("=================================================");

💻 ఈ LINQ అనలిటిక్స్ కోడ్‌ను ఆన్‌లైన్ కంపైలర్‌లో రన్ చేయండి!

GroupBy, Sum, Average, OrderBy, మరియు Take పేజినేషన్ల నిజమైన అవుట్‌పుట్‌ను .NET 8 కంపైలర్‌లో పరిశీలించండి.

13 🎓 ఇంటర్వ్యూ ప్రశ్నలు, బెస్ట్ ప్రాక్టీసెస్ & 5 ఇంటరాక్టివ్ క్విజ్ ప్రశ్నలు

టాప్ ఇంటర్వ్యూ ప్రశ్నలు & సమాధానాలు:

Q1: LINQ లో Deferred Execution అంటే ఏమిటి?

జవాబు: క్వెరీని డిక్లేర్ చేసిన వెంటనే అది ఎగ్జిక్యూట్ అవ్వదు. ఆ డేటాను foreach లూప్ ద్వారా రిక్వెస్ట్ చేసినప్పుడు లేదా ToList(), Count() వంటి తక్షణ మెథడ్స్ పిలిచినప్పుడు మాత్రమే క్వెరీ మెమరీలో రన్ అవుతుంది. దీనివల్ల అనవసరమైన లూపింగ్ ఆగి పెర్ఫార్మెన్స్ పెరుగుతుంది.

Q2: First() కి మరియు FirstOrDefault() కి మధ్య తేడా ఏమిటి?

జవాబు: ఇచ్చిన షరతుకు సరిపడే ఎలిమెంట్ లిస్ట్‌లో లేకపోతే First() మెథడ్ InvalidOperationException విసిరి ప్రోగ్రామ్‌ను క్రాష్ చేస్తుంది. కానీ FirstOrDefault() ఎర్రర్ ఇవ్వకుండా సురక్షితంగా ఆ టైప్ యొక్క డీఫాల్ట్ విలువను (Reference types కు null) రిటర్న్ చేస్తుంది.

🧠 మీ నాలెడ్జ్ చెక్ చేసుకోండి — 5 ఇంటరాక్టివ్ క్విజ్ ప్రశ్నలు

❓ ప్రశ్న 1: కలెక్షన్‌లో డేటా ఉందో లేదో పరీక్షించడానికి ఏ మెథడ్ అత్యంత వేగవంతమైనది?
సమాధానం: .Any(). ఇది మొదటి రికార్డు కనిపించగానే O(1) లో తక్షణమే ఆగిపోతుంది. Count() > 0 మొత్తం లిస్ట్‌ను లెక్కిస్తుంది కాబట్టి నెమ్మదిస్తుంది.
❓ ప్రశ్న 2: LINQ క్వెరీని తక్షణమే ఎగ్జిక్యూట్ చేసి మెమరీలో లిస్ట్‌గా భద్రపరచడానికి ఏ మెథడ్ వాడాలి?
సమాధానం: .ToList().
❓ ప్రశ్న 3: OrderBy తర్వాత రెండో కాలమ్ ఆధారంగా సార్టింగ్ చేయడానికి ఏ మెథడ్ వాడాలి?
సమాధానం: ThenBy() లేదా ThenByDescending().
❓ ప్రశ్న 4: వెబ్ అప్లికేషన్లలో పేజినేషన్ కోసం ఏ రెండు LINQ ఆపరేటర్లను జతగా ఉపయోగిస్తారు?
సమాధానం: Skip మరియు Take (ఉదా: .Skip(10).Take(10)).
❓ ప్రశ్న 5: Single() మెథడ్ ఎప్పుడు ఎక్సెప్షన్ విసురుతుంది?
సమాధానం: కలెక్షన్‌లో అసలు ఎలిమెంట్ లేకపోయినా OR ఒకటి కంటే ఎక్కువ ఎలిమెంట్లు ఉన్నా — రెండు సందర్భాల్లోనూ Single() ఎర్రర్ విసురుతుంది. ఖచ్చితంగా ఒకే ఒక్క ఎలిమెంట్ ఉన్నప్పుడే పనిచేస్తుంది.
← Previous: 18. డెలిగేట్స్, ఈవెంట్స్ & లాంబ్డా Next: 20. గ్రాండ్ మినీ ప్రాజెక్ట్ (ఫినాలే) →
OC
Written by Our Compiler Technical Editorial Team
Reviewed for accuracy & tested on .NET 8 SDK / C# 12 runtime · 2026 Academic Edition