আমার কাছে বাইটগুলির একটি ছোট তালিকা রয়েছে এবং আমি এটি পরীক্ষা করতে চাই যে সেগুলি সমস্ত ভিন্ন মান। উদাহরণস্বরূপ, আমার এটি রয়েছে:
List<byte> theList = new List<byte> { 1,4,3,6,1 };
সমস্ত মান পৃথক কিনা তা যাচাই করার সর্বোত্তম উপায় কী?
আমার কাছে বাইটগুলির একটি ছোট তালিকা রয়েছে এবং আমি এটি পরীক্ষা করতে চাই যে সেগুলি সমস্ত ভিন্ন মান। উদাহরণস্বরূপ, আমার এটি রয়েছে:
List<byte> theList = new List<byte> { 1,4,3,6,1 };
সমস্ত মান পৃথক কিনা তা যাচাই করার সর্বোত্তম উপায় কী?
উত্তর:
bool isUnique = theList.Distinct().Count() == theList.Count();
এখানে আরও একটি পদ্ধতি যা Enumerable.Distinct+ এর চেয়ে বেশি দক্ষ Enumerable.Count(সিক্যুয়েন্সটি সংগ্রহের ধরণের না হলে আরও বেশি)। এটি এমন একটি ব্যবহার করে HashSet<T>যা সদৃশগুলি মুছে ফেলে, দর্শনগুলিতে খুব দক্ষ এবং একটি গণনা-সম্পত্তি রয়েছে:
var distinctBytes = new HashSet<byte>(theList);
bool allDifferent = distinctBytes.Count == theList.Count;
বা অন্য - আরও সূক্ষ্ম এবং দক্ষ - পদ্ধতির:
var diffChecker = new HashSet<byte>();
bool allDifferent = theList.All(diffChecker.Add);
HashSet<T>.Addfalseউপাদানটি যুক্ত করা যায়নি যদি ইতিমধ্যে এটি ইতিমধ্যে ছিল তবে ফিরে আসে HashSet। Enumerable.Allপ্রথম "মিথ্যা" থামে।
Assert.IsTrue(samples.Add(AwesomeClass.GetUnique()));। তারা ছিল এবং :) +1 টি আপনি টিম জন্য :)
bool allDifferent = theList.All(s => diffChecker.Add(s))
List.All(HashSet.Add)) প্রায় সমস্ত ক্ষেত্রে অন্য দুটি তুলনায় খুব দ্রুত বলে মনে হচ্ছে
ঠিক আছে, এখানে আমি স্ট্যান্ডার্ড। নেট ব্যবহারের কথা ভাবতে পারি এমন সবচেয়ে কার্যকর পদ্ধতি
using System;
using System.Collections.Generic;
public static class Extension
{
public static bool HasDuplicate<T>(
this IEnumerable<T> source,
out T firstDuplicate)
{
if (source == null)
{
throw new ArgumentNullException(nameof(source));
}
var checkBuffer = new HashSet<T>();
foreach (var t in source)
{
if (checkBuffer.Add(t))
{
continue;
}
firstDuplicate = t;
return true;
}
firstDuplicate = default(T);
return false;
}
}
মূলত, পুরো ক্রমটি দু'বার গণনার মূল বিষয়টি যদি আপনি করতে চান তবে প্রথম নকলটি সন্ধান করুন।
আমি একটি খালি এবং একক উপাদান ক্রম বিশেষ কেসিং দ্বারা এটি আরও অনুকূল করতে পারি তবে এটি পঠনযোগ্যতা / ন্যূনতম লাভের সাথে রক্ষণাবেক্ষণযোগ্যতা থেকে অবমূল্যায়ন করবে।
sequenceহওয়া উচিত source)। এগুলি স্থির হয়ে গেলে দুর্দান্ত কাজ করে
if (!checkBuffer.Add(t)) { firstDuplicate = t; return true }লুপে থাকা উচিত ।
Distinctব্যবহার করার অনুরূপ যুক্তি GroupBy:
var isUnique = theList.GroupBy(i => i).Count() == theList.Count;
theList.GroupBy(o => o.SomeProperty).Count() == theList.Count;তবে ডাস্টিনেক্ট () এটি অনুমতি দেয় না তবে এটি কার্যকর।
অনেকগুলি সমাধান রয়েছে।
লিনকিউ ব্যবহারের সাথে "জুয়েরজেন ডি" এবং "টিম শেমলেটার" উল্লেখ করা সন্দেহজনক কোন সন্দেহ নেই।
তবে, যদি আপনি "জটিলতা" এবং গতি অর্জন করেন তবে সেরা সমাধানটি নিজের দ্বারা বাস্তবায়ন করা হবে implement সমাধানগুলির মধ্যে একটি হ'ল এন আকারের একটি অ্যারে তৈরি করা হবে (বাইটের জন্য এটি 256)। এবং অ্যারে লুপ করুন, এবং প্রতিটি পুনরাবৃত্তির সাথে মিলটি নম্বর সূচকটি পরীক্ষা করে দেখাবে যদি মানটি 1 হয় তবে এর অর্থ আমি ইতিমধ্যে অ্যারে সূচককে বাড়িয়েছি এবং তাই অ্যারে আলাদা নয় অন্যথায় আমি অ্যারে সেলটি বৃদ্ধি করব এবং চেকিং চালিয়ে যাব ।
এবং অন্য সমাধান, যদি আপনি সদৃশ মানগুলি খুঁজতে চান।
var values = new [] { 9, 7, 2, 6, 7, 3, 8, 2 };
var sorted = values.ToList();
sorted.Sort();
for (var index = 1; index < sorted.Count; index++)
{
var previous = sorted[index - 1];
var current = sorted[index];
if (current == previous)
Console.WriteLine(string.Format("duplicated value: {0}", current));
}
আউটপুট:
duplicated value: 2
duplicated value: 7
কোনও পরীক্ষামূলক (অ্যারে, তালিকা, ইত্যাদি) এর মতো অনন্য কিনা তা আমি পরীক্ষা করি:
var isUnique = someObjectsEnum.GroupBy(o => o.SomeProperty).Max(g => g.Count()) == 1;