সমস্ত তালিকার আইটেমগুলির একই মান রয়েছে কিনা তা কীভাবে চেক করবেন এবং তা ফেরত পাঠাতে হবে, বা যদি না দেয় তবে "অন্যান্য ভ্যালু" ফিরিয়ে আনবেন কীভাবে?


122

তালিকার সমস্ত আইটেমের যদি একই মান হয় তবে আমার সেই মানটি ব্যবহার করা উচিত, অন্যথায় আমাকে একটি "অন্যান্য মূল্য" ব্যবহার করা দরকার। আমি এটি করার সহজ এবং স্পষ্ট উপায় সম্পর্কে ভাবতে পারি না।

সংগ্রহের প্রথম আইটেমটির জন্য বিশেষ যুক্তিযুক্ত লুপটি লেখার ঝরঝরে উপায়টিও দেখুন


আপনার বরং চটকদার মনোযোগ পেতে আমি অনির উত্তর স্ট্যাকওভারফ্লো.com
বাইনারি ওয়ারিয়ার

5
তালিকাটি খালি থাকায় কোনও প্রথম মান না থাকলে আপনি কী হতে চান? সেক্ষেত্রে এটি সত্য যে "তালিকার সমস্ত আইটেমের একই মান রয়েছে" - আপনি যদি আমাকে বিশ্বাস না করেন তবে আমাকে এমন একটি সন্ধান করুন যা না! আপনি এই পরিস্থিতিতে কি করবেন তা নির্ধারণ করেন না। এটি কি একটি ব্যতিক্রম ছুঁড়ে ফেলা উচিত, "অন্যান্য" মানটি ফিরিয়ে দেবে, বা কী?
এরিক লিপার্ট

@ এরিক, দুঃখিত যখন তালিকাটি খালি থাকে তখন এটি "অন্যান্য" মানটি ফিরিয়ে আনতে হবে
ইয়ান রিংরোজ

উত্তর:


153
var val = yyy.First().Value;
return yyy.All(x=>x.Value == val) ? val : otherValue; 

সবচেয়ে সহজ উপায় আমি ভাবতে পারি। আপনি ভ্যাল ইনলাইনিং করে এটি ওয়ান-লাইনার তৈরি করতে পারেন তবে প্রথম () প্রয়োগের সময় দ্বিগুণ করে n বার মূল্যায়ন করা হবে।

মন্তব্যে উল্লিখিত "খালি সেট" আচরণটি সংযুক্ত করতে, আপনি কেবল উপরের দুটিটির আগে আরও একটি লাইন যুক্ত করুন:

if(yyy == null || !yyy.Any()) return otherValue;

1
+1, .Anyবিভিন্ন মান রয়েছে এমন ক্ষেত্রে খুব শীঘ্রই গণনাটি ছেড়ে দেওয়ার অনুমতি ব্যবহার করে?
জেফ ওগাটা

12
@ অ্যাড্রিফ্ট: Allএটি xযার ক্রমটির একটি উপাদানকে হিট করার সাথে সাথেই এটি সমাপ্ত হবে x.Value != val। একইভাবে, Any(x => x.Value != val)এটি xক্রমের একটি উপাদানকে হিট করার সাথে সাথেই এটি বন্ধ হয়ে যাবে x.Value != val। এটি উভয়ই Allএবং Any"সংক্ষিপ্ত-সার্কিট" প্রদর্শন করে যা একই সাথে &&এবং ||(যা কার্যকরভাবে কী Allএবং Anyকী)।
জেসন

@ জেসন: হুবহু সমস্ত (শর্ত) কার্যকরভাবে! যে কোনও (! শর্ত), এবং উভয়ের মূল্যায়ন উত্তর জানা মাত্রই শেষ হবে।
কিথস

4
মাইক্রোপোটিমাইজেশন:return yyy.Skip(1).All(x=>x.Value == val) ? val : otherValue;
13-18 এ ক্যালটার

100

সমস্ত সমান জন্য ভাল দ্রুত পরীক্ষা:

collection.Distinct().Count() == 1

1
এটি কেবল Classকোনওর সাথে কাজ করবে না , যদিও এটি স্ট্রাক্টগুলির সাথে কাজ করা উচিত। আদিমদের তালিকার জন্য দুর্দান্ত।
অ্যান্ড্রু ব্যাকার

2
কিথসের সমাধান আইএমওর চেয়ে +1 বেশি ক্লিনার। আপনি collection.Distinct().Count() <= 1 খালি সংগ্রহের অনুমতি দিতে চাইলে আপনি ব্যবহার করতে চাইতে পারেন।
ডিগ্রাবার

4
সতর্কতা অবলম্বন করুন, .Distinct()সর্বদা প্রত্যাশা অনুযায়ী কাজ করবেন না - বিশেষত যখন আপনি বস্তুগুলির সাথে কাজ করেন, এই প্রশ্নটি দেখুন। সেই ক্ষেত্রে, আপনাকে আইকুয়েটেবল ইন্টারফেস প্রয়োগ করতে হবে।
ম্যাট

16
ক্লিনার, হ্যাঁ, তবে গড় ক্ষেত্রে কম পারফরম্যান্ট; পৃথক () একবারে সংগ্রহের প্রতিটি একক উপাদানকে অতিক্রম করার গ্যারান্টিযুক্ত এবং প্রতিটি উপাদান পৃথক হওয়ার সবচেয়ে খারাপ ক্ষেত্রে, গণনা () সম্পূর্ণ তালিকাটিকে দুইবার অতিক্রম করবে। পৃথক () এছাড়াও একটি হ্যাশসেট তৈরি করে যাতে এর আচরণটি লিনিয়ার হতে পারে এবং এনলগএন বা আরও খারাপ হতে পারে না এবং এটি মেমরির ব্যবহারকে বাড়িয়ে তুলবে। সমস্ত () সমস্ত উপাদান সমান হওয়ার সবচেয়ে খারাপ ক্ষেত্রে সম্পূর্ণ পাস করে এবং কোনও নতুন সংগ্রহ তৈরি করে না।
কিথস

1
@ কীথস আমি আশা করি আপনি এখনই বুঝতে পেরেছেন, Distinctসংগ্রহটি মোটেও অতিক্রম করবেন না এবং এর Countপুনরাবৃত্তির মাধ্যমে একটি ট্র্যাভারসাল করবেন Distinct
নেটমেজ

22

যদিও আপনি অবশ্যই বিদ্যমান সিকোয়েন্স অপারেটরগুলির থেকে এই জাতীয় কোনও ডিভাইস তৈরি করতে পারেন, আমি এই ক্ষেত্রে কাস্টম সিকোয়েন্স অপারেটর হিসাবে এইটিকে লিখতে আগ্রহী। কিছুটা এইরকম:

// Returns "other" if the list is empty.
// Returns "other" if the list is non-empty and there are two different elements.
// Returns the element of the list if it is non-empty and all elements are the same.
public static int Unanimous(this IEnumerable<int> sequence, int other)
{
    int? first = null;
    foreach(var item in sequence)
    {
        if (first == null)
            first = item;
        else if (first.Value != item)
            return other;
    }
    return first ?? other;
}

এটি বেশ পরিষ্কার, সংক্ষিপ্ত, সমস্ত কেসকে কভার করে এবং অযৌক্তিকভাবে ক্রমের অতিরিক্ত পুনরাবৃত্তি তৈরি করে না।

এটিকে কাজ করে IEnumerable<T>এমন একটি জেনেরিক পদ্ধতিতে তৈরি করা অনুশীলন হিসাবে ছেড়ে যায়। :-)


বলুন, উদাহরণস্বরূপ, আপনার nullables এর ক্রম রয়েছে এবং নিষ্কাশিত মানটিও একটি naclable। কোন ক্ষেত্রে, ক্রমটি খালি হতে পারে বা অনুক্রমের প্রতিটি আইটেমের নিষ্কাশিত মানটিতে একটি শূন্যতা থাকতে পারে । এই ক্ষেত্রে কোলেসেসিং otherতখন প্রত্যাবর্তন করবে যখন nullআসলে (সম্ভবত) সঠিক প্রতিক্রিয়া ছিল। বলুন ফাংশনটি ছিল T Unanimous<U, T>(this IEnumerable<U> sequence, T other)বা এই জাতীয় কিছু স্বাক্ষর যা এটিকে কিছুটা জটিল করে তোলে।
অ্যান্টনি পেগ্রাম

@ অ্যান্টনি: প্রকৃতপক্ষে, এখানে অনেক জটিলতা রয়েছে, তবে এগুলি প্রায় সহজেই কাজ করা হয়েছে। আমি সুবিধার্থে একটি নল ইন্ট ব্যবহার করছি যাতে আমাকে "আমি প্রথম আইটেমটি ইতিমধ্যে দেখেছি" পতাকা ঘোষণা করতে না হয়। আপনি সহজেই পতাকাটি ঘোষণা করতে পারেন। এছাড়াও আমি টি এর পরিবর্তে "ইনট" ব্যবহার করছি কারণ আমি জানি যে আপনি সর্বদা সমতার জন্য দুটি ইনট তুলনা করতে পারেন, যা দুটি টিএসের ক্ষেত্রে নয়। এটি একটি সম্পূর্ণ কার্যকরী জেনেরিক সমাধানের চেয়ে কোনও সমাধানের স্কেচ।
এরিক লিপার্ট

13
return collection.All(i => i == collection.First())) 
    ? collection.First() : otherValue;.

বা যদি আপনি প্রতিটি উপাদান (যা একটি কার্যকর কার্যকারিতা উদ্বেগ হতে পারে) জন্য প্রথম () কার্যকর করতে উদ্বিগ্ন হন:

var first = collection.First();
return collection.All(i => i == first) ? first : otherValue;

@ কিথস - এই কারণেই আমি আমার উত্তরের দ্বিতীয় অংশ যুক্ত করেছি। ছোট সংগ্রহগুলিতে, প্রথম () কল করা তুচ্ছ। বড় সংগ্রহগুলিতে, এটি সম্ভবত একটি সমস্যা হতে শুরু করবে।
জাস্টিন নিসনার

1
"ছোট সংগ্রহগুলিতে, প্রথম () কল করা তুচ্ছ।" - এটি সংগ্রহের উত্সের উপর নির্ভর করে। সাধারণ অবজেক্টগুলির একটি তালিকা বা অ্যারের জন্য, আপনি একেবারে ঠিক। তবে, কিছু সংখ্যক সীমাবদ্ধ মেমরি-ক্যাশেড সেট নয়। প্রতিনিধিদের একটি সংগ্রহ, বা একটি গণক যা একটি অ্যালগোরিদমিক সিরিজ গণনা (যেমন ফাইবোনাচি) এর মাধ্যমে আসে, প্রতিবার ফার্স্ট () মূল্যায়ন করার জন্য খুব ব্যয়বহুল হবে।
কিথস

5
আরও খারাপ, যদি ক্যোয়ারী একটি ডেটাবেস কোয়েরি হয় এবং "ফার্স্ট" কল করে প্রতিবার ডাটাবেসটিকে আবার হিট করে।
এরিক লিপার্ট

1
আপনার যদি ফাইল থেকে পড়ার মতো এককালীন পুনরাবৃত্তি হয় তখন এটি আরও খারাপ হয় ... সুতরাং অন্য থ্রেড থেকে অনির উত্তরটি সবচেয়ে ভাল দেখাচ্ছে।
আলেক্সি লেভেনকভ

@ এরিক - কমন প্রতিটি উপাদানটির জন্য তিনবার ডাটাবেস হিট করার কোনও ভুল নেই ... :
পি

3

এটি দেরিতে হতে পারে তবে এরিকের উত্তরের ভিত্তিতে মূল্য এবং রেফারেন্সের ধরণের জন্য একই ধরণের কাজ করা একটি এক্সটেনশন:

public static partial class Extensions
{
    public static Nullable<T> Unanimous<T>(this IEnumerable<Nullable<T>> sequence, Nullable<T> other, IEqualityComparer comparer = null)  where T : struct, IComparable
    {
        object first = null;
        foreach(var item in sequence)
        {
            if (first == null)
                first = item;
            else if (comparer != null && !comparer.Equals(first, item))
                return other;
            else if (!first.Equals(item))
                return other;
        }
        return (Nullable<T>)first ?? other;
    }

    public static T Unanimous<T>(this IEnumerable<T> sequence, T other, IEqualityComparer comparer = null)  where T : class, IComparable
    {
        object first = null;
        foreach(var item in sequence)
        {
            if (first == null)
                first = item;
            else if (comparer != null && !comparer.Equals(first, item))
                return other;
            else if (!first.Equals(item))
                return other;
        }
        return (T)first ?? other;
    }
}

1
public int GetResult(List<int> list){
int first = list.First();
return list.All(x => x == first) ? first : SOME_OTHER_VALUE;
}

1

লিনকিউ ব্যবহারের বিকল্প:

var set = new HashSet<int>(values);
return (1 == set.Count) ? values.First() : otherValue;

আমি দেখতে পেয়েছি যে HashSet<T>তুলনায় 6,000 ডলার পর্যন্ত পূর্ণসংখ্যার তালিকার জন্য দ্রুত ব্যবহার করা হয়েছে:

var value1 = items.First();
return values.All(v => v == value1) ? value1: otherValue;

প্রথমত এটি প্রচুর আবর্জনা তৈরি করতে পারে। এছাড়াও অন্যান্য লিনকিউ উত্তরগুলির পরে এটি কম স্পষ্ট, তবে ধীরে ধীরে এক্সটেনশন পদ্ধতির উত্তরগুলি।
ইয়ান রিংরোজ

সত্য। তবে, আমরা যদি মানগুলির একটি ছোট সেট সব একই হয় কিনা তা নির্ধারণের বিষয়ে কথা বলছি তবে এটি খুব বেশি আবর্জনা হবে না। আমি যখন এই এবং লিনকিউপ্যাডে একটি লিনকিউ বিবৃতিটি একটি ছোট সংখ্যার মানের জন্য চালিয়েছি তখন হ্যাশসেটটি দ্রুত ছিল (স্টপওয়াচ ক্লাস ব্যবহারের সময়সীমা)।
আইমান্ড ǤeezeƦ

আপনি যদি কমান্ড লাইন থেকে রিলিজ বিল্ডে এটি চালনা করেন তবে আপনি বিভিন্ন ফলাফল পেতে পারেন।
ইয়ান রিংরোজ

একটি কনসোল অ্যাপ্লিকেশন তৈরি করেছে এবং এটি HashSet<T>আমার উত্তরটিতে লিনকিউ বিবৃতি ব্যবহার করার চেয়ে প্রাথমিকভাবে দ্রুততর সন্ধান করুন। যাইহোক, আমি যদি এটি কোনও লুপে করি তবে লিনকুইটি দ্রুত।
আইমান্ড ǤeezeƦ

বড় এই সমাধান সঙ্গে সমস্যা যে আপনি আপনার কাস্টম শ্রেণীর ব্যবহার করছি, আপনি আপনার নিজের বাস্তবায়ন করতে হবে তা হল GetHashCode(): যা সঠিকভাবে কিছু দেখুন কঠিন stackoverflow.com/a/371348/2607840 আরো বিস্তারিত জানার জন্য।
ক্যামেরন

0

উপরের সরলীকৃত পদ্ধতির উপর সামান্য প্রকরণ।

var result = yyy.Distinct().Count() == yyy.Count();


3
এটি ঠিক অন্যভাবে রাউন্ড। এটি পরীক্ষা করে নিবে যে তালিকার প্রতিটি উপাদান অনন্য।
মারিও গ্যালিয়া

-1

যদি অ্যারের নীচের মতো মাল্টি-ডাইমেনশন টাইপ হয় তবে ডেটা পরীক্ষা করতে আমাদের নীচে লিঙ্ক লিখতে হবে।

উদাহরণস্বরূপ: এখানে উপাদানগুলি 0 হয় এবং আমি সমস্ত মান 0 বা না হয় তা যাচাই করে দেখছি।
আইপি 1 =
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0 0

    var value=ip1[0][0];  //got the first index value
    var equalValue = ip1.Any(x=>x.Any(xy=>xy.Equals()));  //check with all elements value 
    if(equalValue)//returns true or false  
    {  
    return "Same Numbers";  
    }else{  
    return "Different Numbers";   
    }
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.