2012-06-19 2 views
49

के किसी भी मैं एक इस तरह मानकों की सूची है:चेक सूची <t> शामिल करता है, तो एक और सूची

public class parameter 
{ 
    public string name {get; set;} 
    public string paramtype {get; set;} 
    public string source {get; set;} 
} 

IEnumerable<Parameter> parameters; 

और तार मैं के खिलाफ यह जांच करना चाहते हैं की एक सरणी।

string[] myStrings = new string[] { "one", "two"}; 

मैं पैरामीटर सूची पर पुनरावृति और देखें कि क्या स्रोत संपत्ति myStrings सरणी में से किसी के बराबर है करना चाहते हैं। मैं इसे नेस्टेड फोरैच के साथ कर सकता हूं, लेकिन मैं सीखना चाहता हूं कि इसे कैसे अच्छे तरीके से करना है क्योंकि मैं लिनक के साथ खेल रहा हूं और जैसे कि इत्यादि जैसे विस्तारित तरीकों की तरह विस्तार विधियों को सिर्फ गलत लगता है। ऐसा करने के लिए एक और अधिक सुरुचिपूर्ण पसंदीदा linq/lambda/delegete तरीका है।

धन्यवाद

उत्तर

105

आपको इस चेक जिस पर उपलब्ध है के लिए एक नेस्टेड Any() इस्तेमाल कर सकते हैं किसी भी Enumerable: बड़ा संग्रह पर

bool hasMatch = myStrings.Any(x => parameters.Any(y => y.source == x)); 

तेज़ प्रदर्शन कर source को parameters परियोजना और उसके बाद के लिए होगा Intersect जो आंतरिक रूप से उपयोग करें HashSet<T> का उपयोग करता है, इसलिए पहले दृष्टिकोण (दो नेस्टेड लूप के बराबर) के लिए ओ (एन^2) के बजाय आप ओ (एन):

में चेक कर सकते हैं
bool hasMatch = parameters.Select(x => x.source) 
          .Intersect(myStrings) 
          .Any(); 

साथ ही एक साइड टिप्पणी के रूप में आपको सी # शैली दिशानिर्देशों के अनुरूप अपने वर्ग के नाम और संपत्ति के नामों को पूंजीकृत करना चाहिए।

+0

धन्यवाद ऐसा लगता है कि मैं क्या देख रहा हूं, मैं इसे आजमाउंगा। चीजों के कार्यात्मक पक्ष के साथ थोड़ा और खेलने की जरूरत है। पूंजीकरण वर्ग और गुणों के संबंध में, मैं उपर्युक्त उदाहरण लिखते समय बस भूल गया था। – gdp

+0

क्यों ओ (एन^2)? क्या यह ओ (एन * एम) नहीं है क्योंकि हम दो चर के बारे में बात कर रहे हैं और एक नहीं? चूंकि एम (पैरामीट) स्थिर हैं, यह ओ (एन) जैसा ही है। मैं नहीं देखता कि यहां कितना अंतर होना चाहिए? लेकिन सहमत हुए, इंटरसेक्ट में तेज़ी से होने की संभावना है, लेकिन इसकी गारंटी नहीं है। – Squazz

+0

आप सही हैं कि यह ओ (एन * एम) होना चाहिए - एम स्थिर नहीं है - यह सूचियों में से एक का आकार है, भले ही विशेष उदाहरण में यह "2" हो। यहां तक ​​कि निरंतर मूल्य भी अभ्यास में नगण्य नहीं हैं - सभी गैर-तुच्छ सूची की लंबाई के लिए 'इंटरसेक्ट' तेजी से होगा - यदि सूचियां कम से कम छोटी हैं, तो इससे कोई फर्क नहीं पड़ता है, किसी भी मामले में कोई दूसरा तरीका नहीं है (उस स्थिति में प्रदर्शन शायद आपकी चिंता नहीं है वैसे भी) – BrokenGlass

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