2013-07-01 1 views
16

साथ कम से कम एक मैच के लिए सूचियां क्या सबसे अच्छा तरीका है (औसतन) LINQ के साथ दो सूचियों की तुलना करने के लिए (क्वेरी सिंटैक्स या अन्यथा)खोजें दो LINQ

var A = new [] { 1, 2, 3, ... }; 
var B = new [] { 4, 1, 5, ... }; 

bool match = 
    // Some LINQ expression 

ऐसी है कि match सच होगा जब कम से कम है पहली सूची में एक तत्व (इस मामले में 1) दूसरे से एक तत्व के बराबर है? मुझे यह जानने की जरूरत नहीं है कि वहां कितने मैच थे, या यहां तक ​​कि किससे मेल खाता था, बस कम से कम एक मैच था।

उत्तर

26

निश्चित रूप से वहाँ है।

A.Intersect(B).Any(); 

Intersect हमेशा कम से कम उम्मीद परिस्थितियों में उपयोगी है।

+1

आप का विस्तार किया जा सका: तो Any शॉर्ट सर्किट बेहतर है, क्योंकि यह होगा यह सही क्यों है, और दूसरों को नहीं? –

+2

@EricB वे सभी सही हैं, इस अर्थ में कि वे आपको एक ही जवाब देंगे। यह बड़े सेट के लिए सबसे कुशल है। –

+0

@EricB दाएं, यह छोटे सेट के साथ (99% समय बेहतर) के बारे में करता है, और बड़े सेट के साथ अभी भी बेहतर है। –

6

आप Intersect का उपयोग कर सकते हैं, लेकिन यह उन सभी मैचों की गणना करेगा, जिनकी आपको आवश्यकता नहीं है।

bool match = A.Any(a => B.Any(b => b == a)); 
+0

अच्छा बिंदु। मैंने कभी सोचा नहीं था कि 'इंटरसेक्ट' पूरी तरह से उपज करने से पहले संचालित होता है। यह समझ में आता है। –

+3

@ सिमोनबेलगर सही, लेकिन सबसे खराब मामला यह 'ओ (एमएन) 'है। निश्चित रूप से, सबसे अच्छा मामला 'ओ (एम) 'है, लेकिन सर्वोत्तम मामले आम नहीं हैं। 'छेड़छाड़', ओओटी, हमेशा 'ओ (एम + एन) 'है। –

+0

@newStackExchangeInstance यह वास्तव में विशिष्ट मामलों के लिए आता है। जानकारी के लिए धन्यवाद, विभिन्न LINQ ऑपरेटरों की जटिलता को देखने के लिए हमेशा उत्सुक है। –

2

आप Any

bool match = A.Intersect(B).Any(); 
3

Intersect का एक संयोजन और की तलाश में हैं तो आप भी उपयोग कर सकते हैं

A.Any(x => B.Contains(x)) 
+1

खैर, हाँ ... लेकिन यह (सबसे खराब मामला) 'ओ (एमएन)' है, जबकि 'इंटरसेक्ट' 'ओ (एम + एन)' (हर समय) –

+0

कभी भी इसके बारे में कभी नहीं सोचा –

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