C# में किसी सूची (List<T>) से डुप्लिकेट (नकल) तत्वों को हटाने के लिए LINQ का Distinct() मेथड सबसे सरल और सामान्य तरीका है। यह एक नया अनुक्रम लौटाता है जिसमें केवल अद्वितीय (unique) तत्व होते हैं।
उदाहरण
using System;
using System.Collections.Generic;
using System.Linq;
public class Demo
{
public static void Main()
{
// डुप्लिकेट वाली सूची
List numbers = new List { 10, 20, 30, 40, 50, 30, 40, 50 };
Console.WriteLine("मूल सूची:");
Console.WriteLine($" [{string.Join(", ", numbers)}]");
Console.WriteLine($" कुल तत्व: {numbers.Count}");
// Distinct() से डुप्लिकेट हटाएं
List distinctNumbers = numbers.Distinct().ToList();
Console.WriteLine("\nडुप्लिकेट हटाने के बाद:");
Console.WriteLine($" [{string.Join(", ", distinctNumbers)}]");
Console.WriteLine($" कुल तत्व: {distinctNumbers.Count}");
}
}
आउटपुट
मूल सूची: [10, 20, 30, 40, 50, 30, 40, 50] कुल तत्व: 8 डुप्लिकेट हटाने के बाद: [10, 20, 30, 40, 50] कुल तत्व: 5
कस्टम तुलना के साथ Distinct()
डिफॉल्ट रूप से Distinct() डिफॉल्ट समानता तुलनाकर्ता (equality comparer) का उपयोग करता है। कस्टम तुलना के लिए IEqualityComparer<T> लागू करें।
using System;
using System.Collections.Generic;
using System.Linq;
public class Product
{
public int Id { get; set; }
public string Name { get; set; }
public decimal Price { get; set; }
}
public class ProductNameComparer : IEqualityComparer
{
public bool Equals(Product x, Product y)
{
if (x is null && y is null) return true;
if (x is null || y is null) return false;
return string.Equals(x.Name, y.Name, StringComparison.OrdinalIgnoreCase);
}
public int GetHashCode(Product obj)
{
return obj.Name?.ToLowerInvariant().GetHashCode() ?? 0;
}
}
public class Demo
{
public static void Main()
{
var products = new List
{
new Product { Id = 1, Name = "Laptop", Price = 50000 },
new Product { Id = 2, Name = "Mouse", Price = 500 },
new Product { Id = 3, Name = "LAPTOP", Price = 45000 }, // डुप्लिकेट नाम (केस अलग)
new Product { Id = 4, Name = "Keyboard", Price = 1500 }
};
Console.WriteLine("मूल सूची:");
foreach (var p in products)
Console.WriteLine($" ID:{p.Id} Name:{p.Name} Price:₹{p.Price}");
// कस्टम तुलनाकर्ता के साथ Distinct
var uniqueProducts = products.Distinct(new ProductNameComparer()).ToList();
Console.WriteLine("\nनाम के अनुसार अद्वितीय (केस-इनसेंसिटिव):");
foreach (var p in uniqueProducts)
Console.WriteLine($" ID:{p.Id} Name:{p.Name} Price:₹{p.Price}");
}
}
आउटपुट
मूल सूची: ID:1 Name:Laptop Price:₹50000 ID:2 Name:Mouse Price:₹500 ID:3 Name:LAPTOP Price:₹45000 ID:4 Name:Keyboard Price:₹1500 नाम के अनुसार अद्वितीय (केस-इनसेंसिटिव): ID:1 Name:Laptop Price:₹50000 ID:2 Name:Mouse Price:₹500 ID:4 Name:Keyboard Price:₹1500
DistinctBy() - .NET 6+ / C# 10+ (सरल विकल्प)
// .NET 6+ के लिए (System.Linq में)
var uniqueByName = products.DistinctBy(p => p.Name).ToList();
// या की-सेलेक्टर के साथ (पुराने संस्करणों के लिए मैन्युअल)
var uniqueByNameOld = products
.GroupBy(p => p.Name, StringComparer.OrdinalIgnoreCase)
.Select(g => g.First())
.ToList();
प्रदर्शन तुलना
using System;
using System.Collections.Generic;
using System.Linq;
using System.Diagnostics;
public class Demo
{
public static void Main()
{
// बड़ी सूची बनाएं (100,000 तत्व, कई डुप्लिकेट)
var random = new Random(42);
var largeList = new List(100000);
for (int i = 0; i < 100000; i++)
largeList.Add(random.Next(1, 1000)); // केवल 1000 अद्वितीय मान संभव
var sw = Stopwatch.StartNew();
var distinct1 = largeList.Distinct().ToList();
Console.WriteLine($"Distinct(): {sw.ElapsedMilliseconds} ms, अद्वितीय: {distinct1.Count}");
sw.Restart();
var distinct2 = largeList.ToHashSet().ToList(); // HashSet विकल्प
Console.WriteLine($"ToHashSet(): {sw.ElapsedMilliseconds} ms, अद्वितीय: {distinct2.Count}");
// क्रम बनाए रखने के लिए
sw.Restart();
var seen = new HashSet();
var distinct3 = largeList.Where(x => seen.Add(x)).ToList();
Console.WriteLine($"HashSet+Where: {sw.ElapsedMilliseconds} ms, अद्वितीय: {distinct3.Count}");
}
}
महत्वपूर्ण बिंदु
Distinct()मूल सूची को नहीं बदलता, नई सूची/अनुक्रम लौटाता है- क्रम (order) बने रहता है - पहली घटना रखी जाती है
ToList()याToArray()कॉल करके भौतिक सूची/सरणी प्राप्त करें- संदर्भ प्रकारों के लिए डिफॉल्ट तुलना रेफरेंस समानता है (कस्टम
IEqualityComparerउपयोग करें) - बड़े डेटासेट के लिए
HashSetआधारित दृष्टिकोण तेज हो सकता है DistinctBy()(.NET 6+) की-सेलेक्टर के साथ सरल सिंटैक्स प्रदान करता है