2011-03-15 18 views
39

में समान हैं या नहीं, मेरे पास एक सूची (दिनांक तिथि) आइटम है। मैं LINQ क्वेरी के साथ सभी आइटम समान कैसे देख सकता हूं? किसी भी समय सूची में 1, 2, 20, 50 या 100 आइटम हो सकते हैं।जांचें कि सभी आइटम एक सूची

धन्यवाद

उत्तर

67
इस तरह

:

if (list.Distinct().Skip(1).Any()) 

या

if (list.Any(o => o != list[0])) 

(जो शायद तेजी से होता है)

+12

"किसी भी" के बजाय "सभी" के साथ पढ़ने के लिए संभावित रूप से आसान है। यदि सूची एक्सेस नहीं किया जा सकता है (IENumerable) में आप [0] के बजाय पहले() का भी उपयोग करना चाह सकते हैं। अगर (list.All (o => o == list.First())) {...} –

+0

'सूची। डिज़ाइन() छोड़ें (1) .एनी() 'सूची से अलग नहीं है। डिज़ाइन ()। गणना! = 1' सही? –

+0

@Graeme किसी भी वस्तु का पूरा बिंदु विकृत() एक आइटम पाया जाता है जो मेल नहीं खाता है। फिर आप सूची का मूल्यांकन करना बंद कर देते हैं। हालांकि थोड़ा स्पष्ट है हालांकि! '(सूची। कोई (ओ => ओ! = सूची [0]))' जो सच है यदि कोई आइटम नहीं है जो पहले से अलग है - यानी यदि वे सभी एक जैसे हैं –

1

VB.NET संस्करण:

If list.Distinct().Skip(1).Any() Then 

या

If list.Any(Function(d) d <> list(0)) Then 
4

मैं मुख्य रूप से पठनीयता है कि किसी भी IEnumerable पर काम करता है के लिए बनाया सरल विस्तार विधि।

if (items.AreAllSame()) ... 

और विधि कार्यान्वयन:

/// <summary> 
    /// Checks whether all items in the enumerable are same (Uses <see cref="object.Equals(object)" /> to check for equality) 
    /// </summary> 
    /// <typeparam name="T"></typeparam> 
    /// <param name="enumerable">The enumerable.</param> 
    /// <returns> 
    /// Returns true if there is 0 or 1 item in the enumerable or if all items in the enumerable are same (equal to 
    /// each other) otherwise false. 
    /// </returns> 
    public static bool AreAllSame<T>(this IEnumerable<T> enumerable) 
    { 
     if (enumerable == null) throw new ArgumentNullException(nameof(enumerable)); 

     using (var enumerator = enumerable.GetEnumerator()) 
     { 
      var toCompare = default(T); 
      if (enumerator.MoveNext()) 
      { 
       toCompare = enumerator.Current; 
      } 

      while (enumerator.MoveNext()) 
      { 
       if (toCompare != null && !toCompare.Equals(enumerator.Current)) 
       { 
        return false; 
       } 
      } 
     } 

     return true; 
    } 
0

यह एक विकल्प भी है:

if (list.TrueForAll(i => i.Equals(list.FirstOrDefault()))) 

यह if (list.Distinct().Skip(1).Any()) की तुलना में तेजी है, और if (list.Any(o => o != list[0])), तथापि, अंतर के रूप में इसी तरह प्रदर्शन करती है महत्वपूर्ण नहीं है, इसलिए मैं अधिक पठनीय एक का उपयोग करने का सुझाव देता हूं।

संबंधित मुद्दे