লিনকিউ ব্যবহার করে, এ থেকে List<int>
, আমি কীভাবে এমন একটি তালিকা পুনরুদ্ধার করতে পারি যাতে একাধিকবার পুনরাবৃত্তি এবং তাদের মানগুলি থাকে?
লিনকিউ ব্যবহার করে, এ থেকে List<int>
, আমি কীভাবে এমন একটি তালিকা পুনরুদ্ধার করতে পারি যাতে একাধিকবার পুনরাবৃত্তি এবং তাদের মানগুলি থাকে?
উত্তর:
সমস্যা সমাধানের সহজতম উপায় হ'ল উপাদানগুলির মানগুলির উপর ভিত্তি করে দলবদ্ধ করা এবং তারপরে গ্রুপে একাধিক উপাদান উপস্থিত থাকলে গ্রুপের প্রতিনিধি বাছাই করা। লিংক-এ, এটি অনুবাদ করে:
var query = lst.GroupBy(x => x)
.Where(g => g.Count() > 1)
.Select(y => y.Key)
.ToList();
আপনি যদি উপাদানগুলি কতবার পুনরাবৃত্তি করতে চান তা জানতে আপনি ব্যবহার করতে পারেন:
var query = lst.GroupBy(x => x)
.Where(g => g.Count() > 1)
.Select(y => new { Element = y.Key, Counter = y.Count() })
.ToList();
এটি List
একটি বেনামি ধরণের একটি ফিরিয়ে দেবে , এবং প্রতিটি উপাদানগুলির বৈশিষ্ট্য Element
এবং Counter
আপনার প্রয়োজনীয় তথ্য পুনরুদ্ধার করতে হবে।
এবং সবশেষে, এটি যদি আপনি অভিধান খুঁজছেন তবে এটি ব্যবহার করতে পারেন
var query = lst.GroupBy(x => x)
.Where(g => g.Count() > 1)
.ToDictionary(x => x.Key, y => y.Count());
এটি আপনার কী হিসাবে আপনার উপাদানটি সহ একটি অভিধান এবং এটির মান হিসাবে বারবার পুনরাবৃত্তি করবে।
code
(int i = 0; i <সদৃশ। হিসাব; i ++) {int সদৃশ = নকল [i]; সদৃশ অবস্থান.এড করুন (সদৃশ, নতুন তালিকা <int> ()); (int k = 0; k <hitsList.Length; k ++) {if (hitsList [k] .Contains (সদৃশ)) {সদৃশ লোকেশন.এলিমেন্ট (i)। ভ্যালু .এড (কে); }} // কিছু নিয়ম অনুসারে সদৃশগুলি সরান। }code
একটি গুণমানের কোনও সদৃশ রয়েছে কিনা তা সন্ধান করুন :
var anyDuplicate = enumerable.GroupBy(x => x.Key).Any(g => g.Count() > 1);
খুঁজে পাবেন যদি সব একটি গণনীয় মধ্যে মান অনন্য :
var allUnique = enumerable.GroupBy(x => x.Key).All(g => g.Count() == 1);
আর একটি উপায় ব্যবহার করা হচ্ছে HashSet
:
var hash = new HashSet<int>();
var duplicates = list.Where(i => !hash.Add(i));
আপনি যদি আপনার সদৃশ তালিকায় অনন্য মান চান:
var myhash = new HashSet<int>();
var mylist = new List<int>(){1,1,2,2,3,3,3,4,4,4};
var duplicates = mylist.Where(item => !myhash.Add(item)).Distinct().ToList();
এখানে জেনেরিক এক্সটেনশন পদ্ধতি হিসাবে একই সমাধান:
public static class Extensions
{
public static IEnumerable<TSource> GetDuplicates<TSource, TKey>(this IEnumerable<TSource> source, Func<TSource, TKey> selector, IEqualityComparer<TKey> comparer)
{
var hash = new HashSet<TKey>(comparer);
return source.Where(item => !hash.Add(selector(item))).ToList();
}
public static IEnumerable<TSource> GetDuplicates<TSource>(this IEnumerable<TSource> source, IEqualityComparer<TSource> comparer)
{
return source.GetDuplicates(x => x, comparer);
}
public static IEnumerable<TSource> GetDuplicates<TSource, TKey>(this IEnumerable<TSource> source, Func<TSource, TKey> selector)
{
return source.GetDuplicates(selector, null);
}
public static IEnumerable<TSource> GetDuplicates<TSource>(this IEnumerable<TSource> source)
{
return source.GetDuplicates(x => x, null);
}
}
List<int> { 1, 2, 3, 4, 5, 2 }
উত্স হিসাবে ব্যবহার করে , ফলাফলটি এমন একটি IEnumerable<int>
উপাদানের সাথে 1
Console.WriteLine("Count: {0}", duplicates.Count());
নীচে লাইনটি যুক্ত করেছি এবং এটি মুদ্রণ করে 6
। আমি এই ফাংশনটির প্রয়োজনীয়তাগুলি সম্পর্কে কিছু অনুপস্থিত না করে ফলস্বরূপ সংগ্রহে কেবলমাত্র 1 টি আইটেম থাকা উচিত।
ToList
সমস্যাটি সংশোধন করার জন্য যুক্ত করেছি , তবে এর অর্থ হল যে পদ্ধতিটি বলা হওয়ার সাথে সাথেই এটি কার্যকর করা হবে এবং আপনি ফলাফলগুলি পুনরুক্তি করার সময় নয়।
var hash = new HashSet<int>();
var duplicates = list.Where(i => !hash.Add(i));
ডুপ্লিকেটগুলির সমস্ত উপস্থিতি অন্তর্ভুক্ত একটি তালিকায় নিয়ে যাবে। সুতরাং আপনার তালিকায় যদি 2 টির চারটি উপস্থিতি থাকে তবে আপনার সদৃশ তালিকায় 2 টির তিনটি উপস্থিতি থাকবে, যেহেতু 2 এর মধ্যে একটিরও হ্যাশসেটে যুক্ত করা যায়। যদি আপনি চান যে আপনার তালিকায় প্রতিটি var duplicates = mylist.Where(item => !myhash.Add(item)).ToList().Distinct().ToList();
তুমি এটি করতে পারো:
var list = new[] {1,2,3,1,4,2};
var duplicateItems = list.Duplicates();
এই এক্সটেনশন পদ্ধতিগুলির সাথে:
public static class Extensions
{
public static IEnumerable<TSource> Duplicates<TSource, TKey>(this IEnumerable<TSource> source, Func<TSource, TKey> selector)
{
var grouped = source.GroupBy(selector);
var moreThan1 = grouped.Where(i => i.IsMultiple());
return moreThan1.SelectMany(i => i);
}
public static IEnumerable<TSource> Duplicates<TSource, TKey>(this IEnumerable<TSource> source)
{
return source.Duplicates(i => i);
}
public static bool IsMultiple<T>(this IEnumerable<T> source)
{
var enumerator = source.GetEnumerator();
return enumerator.MoveNext() && enumerator.MoveNext();
}
}
সদৃশ পদ্ধতিতে ইসমুলটিপল () ব্যবহার করা গণনা () এর চেয়ে দ্রুততর কারণ এটি পুরো সংগ্রহকে পুনরাবৃত্তি করে না।
Count()
এটি প্রাক গণিত এবং আপনার সমাধান সম্ভবত ধীর।
Count()
] সম্পূর্ণ তালিকার পুনরাবৃত্তির চেয়ে মূলত আলাদা। Count()
প্রাক-গণিত হয় তবে পুরো তালিকাটি পুনরাবৃত্তি করা হয় না।
আমি আপনার প্রকল্পগুলিতে এটি অন্তর্ভুক্ত করতে পারে এর প্রতিক্রিয়াটির জন্য আমি একটি উত্সাহ তৈরি করেছি, আমি মনে করি আপনি তালিকা বা লিনিকের অনুলিপি সন্ধান করার সময় এটি সবচেয়ে বেশি ফিরে আসে।
উদাহরণ:
//Dummy class to compare in list
public class Person
{
public int Id { get; set; }
public string Name { get; set; }
public string Surname { get; set; }
public Person(int id, string name, string surname)
{
this.Id = id;
this.Name = name;
this.Surname = surname;
}
}
//The extention static class
public static class Extention
{
public static IEnumerable<T> getMoreThanOnceRepeated<T>(this IEnumerable<T> extList, Func<T, object> groupProps) where T : class
{ //Return only the second and next reptition
return extList
.GroupBy(groupProps)
.SelectMany(z => z.Skip(1)); //Skip the first occur and return all the others that repeats
}
public static IEnumerable<T> getAllRepeated<T>(this IEnumerable<T> extList, Func<T, object> groupProps) where T : class
{
//Get All the lines that has repeating
return extList
.GroupBy(groupProps)
.Where(z => z.Count() > 1) //Filter only the distinct one
.SelectMany(z => z);//All in where has to be retuned
}
}
//how to use it:
void DuplicateExample()
{
//Populate List
List<Person> PersonsLst = new List<Person>(){
new Person(1,"Ricardo","Figueiredo"), //fist Duplicate to the example
new Person(2,"Ana","Figueiredo"),
new Person(3,"Ricardo","Figueiredo"),//second Duplicate to the example
new Person(4,"Margarida","Figueiredo"),
new Person(5,"Ricardo","Figueiredo")//third Duplicate to the example
};
Console.WriteLine("All:");
PersonsLst.ForEach(z => Console.WriteLine("{0} -> {1} {2}", z.Id, z.Name, z.Surname));
/* OUTPUT:
All:
1 -> Ricardo Figueiredo
2 -> Ana Figueiredo
3 -> Ricardo Figueiredo
4 -> Margarida Figueiredo
5 -> Ricardo Figueiredo
*/
Console.WriteLine("All lines with repeated data");
PersonsLst.getAllRepeated(z => new { z.Name, z.Surname })
.ToList()
.ForEach(z => Console.WriteLine("{0} -> {1} {2}", z.Id, z.Name, z.Surname));
/* OUTPUT:
All lines with repeated data
1 -> Ricardo Figueiredo
3 -> Ricardo Figueiredo
5 -> Ricardo Figueiredo
*/
Console.WriteLine("Only Repeated more than once");
PersonsLst.getMoreThanOnceRepeated(z => new { z.Name, z.Surname })
.ToList()
.ForEach(z => Console.WriteLine("{0} -> {1} {2}", z.Id, z.Name, z.Surname));
/* OUTPUT:
Only Repeated more than once
3 -> Ricardo Figueiredo
5 -> Ricardo Figueiredo
*/
}
কেবলমাত্র সদৃশ মানগুলি সন্ধান করতে:
var duplicates = list.GroupBy(x => x.Key).Any(g => g.Count() > 1);
যেমন। var তালিকা = নতুন [] {1,2,3,1,4,2};
সুতরাং গোষ্ঠী অনুসারে সংখ্যাগুলি তাদের কী দ্বারা গোষ্ঠীভুক্ত করবে এবং এটির সাথে গণনাটি (এটি পুনরাবৃত্তির সংখ্যা) বজায় রাখবে। এর পরে, আমরা কেবল সেই মানগুলি যাচাই করছি যা একাধিকবার পুনরাবৃত্তি করেছে।
একমাত্র মানগুলি খুঁজে পেতে:
var unique = list.GroupBy(x => x.Key).All(g => g.Count() == 1);
যেমন। var তালিকা = নতুন [] {1,2,3,1,4,2};
সুতরাং গোষ্ঠী অনুসারে সংখ্যাগুলি তাদের কী দ্বারা গোষ্ঠীভুক্ত করবে এবং এটির সাথে গণনাটি (এটি পুনরাবৃত্তির সংখ্যা) বজায় রাখবে। এর পরে, আমরা কেবল সেই মানগুলি যাচাই করে যাঁরা কেবল একবারে পুনরাবৃত্তি করেছেন তার অর্থ অনন্য।
var unique = list.Distinct(x => x)
এমএস এসকিউএল সার্ভারে চেক ডুপ্লিকেট ফাংশনগুলির লিনাক থেকে এসকিউএল এক্সটেনশনের সম্পূর্ণ সেট। .ToList () বা IEnumerable ব্যবহার না করে। এই ক্যোয়ারী মেমরির চেয়ে এসকিউএল সার্ভারে কার্যকর করা হচ্ছে। । ফলাফলগুলি কেবল স্মৃতিতে ফিরে আসে।
public static class Linq2SqlExtensions {
public class CountOfT<T> {
public T Key { get; set; }
public int Count { get; set; }
}
public static IQueryable<TKey> Duplicates<TSource, TKey>(this IQueryable<TSource> source, Expression<Func<TSource, TKey>> groupBy)
=> source.GroupBy(groupBy).Where(w => w.Count() > 1).Select(s => s.Key);
public static IQueryable<TSource> GetDuplicates<TSource, TKey>(this IQueryable<TSource> source, Expression<Func<TSource, TKey>> groupBy)
=> source.GroupBy(groupBy).Where(w => w.Count() > 1).SelectMany(s => s);
public static IQueryable<CountOfT<TKey>> DuplicatesCounts<TSource, TKey>(this IQueryable<TSource> source, Expression<Func<TSource, TKey>> groupBy)
=> source.GroupBy(groupBy).Where(w => w.Count() > 1).Select(y => new CountOfT<TKey> { Key = y.Key, Count = y.Count() });
public static IQueryable<Tuple<TKey, int>> DuplicatesCountsAsTuble<TSource, TKey>(this IQueryable<TSource> source, Expression<Func<TSource, TKey>> groupBy)
=> source.GroupBy(groupBy).Where(w => w.Count() > 1).Select(s => Tuple.Create(s.Key, s.Count()));
}
একটি উত্তর আছে তবে আমি বুঝতে পারি না কেন কাজ করছে না;
var anyDuplicate = enumerable.GroupBy(x => x.Key).Any(g => g.Count() > 1);
আমার সমাধান এই পরিস্থিতিতে যেমন;
var duplicates = model.list
.GroupBy(s => s.SAME_ID)
.Where(g => g.Count() > 1).Count() > 0;
if(duplicates) {
doSomething();
}