Except ऑपरेटर आपको उस डेटा को क्वेरी करने की अनुमति देने के लिए डिज़ाइन किया गया है जो IEnumerable<T> इंटरफेस का समर्थन करता है। चूंकि सभी LINQ क्वेरी एक्सप्रेशन्स, और अधिकांश LINQ क्वेरीज, IEnumerable<T> लौटाते हैं, ये ऑपरेटर्स आपको LINQ क्वेरी के परिणामों पर सेट ऑपरेशन करने की अनुमति देने के लिए डिज़ाइन किए गए हैं।
Except ऑपरेटर एक सूची में सभी आइटम्स को दूसरी सूची में आइटम्स घटाकर दिखाता है।
उदाहरण 1: Except ऑपरेटर का उपयोग करके
class Program
{
static void Main(string[] args)
{
var listA = Enumerable.Range(1, 6); // 1,2,3,4,5,6
var listB = new List<int> { 3, 4 };
var listC = listA.Except(listB); // listA में जो listB में नहीं हैं
foreach (var item in listC)
{
Console.WriteLine(item);
}
Console.ReadLine();
}
}
आउटपुट
1
2
5
6
उदाहरण 2: SQL-जैसे सिंटैक्स का उपयोग करके (Where + Any)
static void Main(string[] args)
{
var listA = Enumerable.Range(1, 6);
var listB = new List<int> { 3, 4 };
var listC = from c in listA
where !listB.Any(o => o == c)
select c;
foreach (var item in listC)
{
Console.WriteLine(item);
}
Console.ReadLine();
}
आउटपुट
1
2
5
6
उदाहरण 3: ऑब्जेक्ट्स के साथ (कस्टम तुलना)
public class Product
{
public int Id { get; set; }
public string Name { get; set; }
}
static void Main()
{
var allProducts = new List<Product>
{
new Product { Id = 1, Name = "Laptop" },
new Product { Id = 2, Name = "Mouse" },
new Product { Id = 3, Name = "Keyboard" }
};
var excludedIds = new List<int> { 2 }; // Mouse को बाहर करें
// विधि 1: Except कस्टम कम्पेरर के साथ
var result1 = allProducts
.Where(p => !excludedIds.Contains(p.Id))
.ToList();
// विधि 2: ExceptBy (.NET 6+)
var result2 = allProducts
.ExceptBy(excludedIds, p => p.Id)
.ToList();
// विधि 3: जॉइन के साथ (बड़े डेटासेट के लिए कुशल)
var result3 = allProducts
.GroupJoin(excludedIds, p => p.Id, id => id, (p, ids) => new { p, ids })
.Where(x => !x.ids.Any())
.Select(x => x.p)
.ToList();
}
Except बनाम Where !Contains
| पहलू | Except | Where !Contains |
|---|---|---|
| पठनीयता | उच्च (सेट ऑपरेशन) | मध्यम |
| प्रदर्शन (छोटा) | समान | समान |
| प्रदर्शन (बड़ा) | O(n+m) हैश-आधारित | O(n*m) बिना ऑप्टिमाइज़ेशन के |
| डुप्लीकेट हैंडलिंग | डुप्लीकेट हटाता है | डुप्लीकेट संरक्षित करता है |
| कस्टम तुलना | IEqualityComparer<T> | लचीला लैम्ब्डा |
.NET 6+ नए मेथड्स
// ExceptBy - की सेलेक्टर द्वारा बाहर करें (अधिक कुशल)
var result = listA.ExceptBy(listB.Select(x => x.Key), x => x.Key);
// IntersectBy - की द्वारा इंटरसेक्शन
var common = listA.IntersectBy(listB.Select(x => x.Key), x => x.Key);
// UnionBy - की द्वारा यूनियन
var combined = listA.UnionBy(listB, x => x.Key);
सारांश
सरल मानों के लिए:listA.Except(listB)
ऑब्जेक्ट्स/कुंजियों के लिए (.NET 6+):listA.ExceptBy(listB, x => x.Id)
लचीली शर्तों के लिए:listA.Where(x => !listB.Contains(x.Id))