किसी भी <T> के विपरीत विधि क्या है


80

अगर किसी संग्रह में कोई ऑब्जेक्ट नहीं है तो मैं Linq के साथ कैसे जांच कर सकता हूं। IE के विपरीत Any<T>

मैं !पठनीयता के लिए परिणाम के साथ उलट सकता था, लेकिन मैंने सोचा कि क्या ऐसा करने के लिए और बेहतर तरीका है? क्या मुझे स्वयं एक्सटेंशन जोड़ना चाहिए?


अधिक पठनीय तब !? Contains, Exists?
तिगरान

3
हाँ, वहाँ नहीं है None<T>। मैं अक्सर पठनीयता के लिए ऐसे कस्टम एक्सटेंशन का उपयोग करता हूं (उदाहरण के लिए मुझे !dictionary.ContainsKey(key)वाक्यविन्यास पसंद नहीं है , इसलिए मैंने dictionary.NoKey(key)इसके बजाय लागू किया।
कोनराड मोरावस्की

2
@Morawski: मैंने उपयोग करना शुरू कर दिया है ConcurrentDictionary, क्योंकि यह वास्तव में आसान GetOrAddविधि है, तब भी जब मुझे संगामिति की आवश्यकता नहीं है।
रोजर लिप्सकॉम्ब

जवाबों:


87

आप आसानी से एक Noneएक्सटेंशन विधि बना सकते हैं :

public static bool None<TSource>(this IEnumerable<TSource> source)
{
    return !source.Any();
}

public static bool None<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate)
{
    return !source.Any(predicate);
}

1
मुझे लगता है कि यह मानक Linq के लिए एक अच्छा जोड़ होगा।
इवान

3
@ इवान, यह खुद लिनक में नहीं है, लेकिन यह मेरे लिनक का हिस्सा हैएक्स्ट्रा लाइब्रेरी
थॉमस लेवेस्क

60

यह सत्यापित करने के विपरीत कि कोई भी (कम से कम एक) रिकॉर्ड एक निश्चित मापदंड से मेल खाता है, यह सत्यापित करना होगा कि सभी रिकॉर्ड मानदंडों से मेल नहीं खाते हैं।

आपने अपना पूर्ण उदाहरण पोस्ट नहीं किया है, लेकिन यदि आप कुछ के विपरीत चाहते हैं:

var isJohnFound = MyRecords.Any(x => x.FirstName == "John");

आप उपयोग कर सकते हैं:

var isJohnNotFound = MyRecords.All(x => x.FirstName != "John");

बस आज Google पर यह आया, और जब मैं आपके दृष्टिकोण से सहमत हूं, तो मैं आमतौर पर उपयोग करता हूंvar isJohnNotFound = !MyRecords.All(x => x.FirstName == "John");
क्रिस

बेशक, मैं नासमझ हूं। जब मैं ऐसा करता हूं तो यह किसी एक क्षेत्र की जाँच नहीं होती है। आमतौर पर यह अधिक पसंद है !MyRecords.All(x => InvalidNames.Any(n => n == x.Name));इसलिए अमान्य नामों की सूची के खिलाफ प्रत्येक प्रविष्टि की जांच करें, केवल अगर कोई भी मैच सही नहीं होगा।
क्रिस

2

जोड़े गए उत्तरों के अतिरिक्त, यदि आप Any()विधि को लपेटना नहीं चाहते हैं तो आप None()निम्नानुसार लागू कर सकते हैं:

public static bool None<TSource>(this IEnumerable<TSource> source) 
{
    if (source == null) { throw new ArgumentNullException(nameof(source)); }

    using (IEnumerator<TSource> enumerator = source.GetEnumerator())
    {
        return !enumerator.MoveNext();
    }
}

public static bool None<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate)
{
    if (source == null) { throw new ArgumentNullException(nameof(source)); }
    if (predicate == null) { throw new ArgumentNullException(nameof(predicate)); }

    foreach (TSource item in source)
    {
        if (predicate(item))
        {
            return false;
        }
    }

    return true;
}

इसके अतिरिक्त पैरामीटर रहित अधिभार के लिए आप ICollection<T>अनुकूलन लागू कर सकते हैं , जो वास्तव में LINQ implemenetation में मौजूद नहीं है।

ICollection<TSource> collection = source as ICollection<TSource>;
if (collection != null) { return collection.Count == 0; }

2

इस धागे को मिला जब मैं यह जानना चाहता था कि क्या संग्रह में एक वस्तु नहीं है, लेकिन मैं यह जांचना नहीं चाहता कि संग्रह में सभी ऑब्जेक्ट दिए गए मानदंडों से मेल खाते हैं। मैं इस तरह एक चेक कर रहा हूं:

var exists = modifiedCustomers.Any(x => x.Key == item.Key);

if (!exists)
{
    continue;
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.