2013-02-08 26 views
35

मान लीजिए मेरे पास तारों का एक .net ऐरे है।आईनेमेरेबल <string> कैसे बनाएं। केस-असंवेदनशील नहीं है?

string[] strings = new string[] { "AbC", "123", "Xyz", "321" }; 

अगर मैं यह देखने के लिए तार के सरणी शामिल है "एबीसी" चाहता था, मैं

strings.Contains("ABC"); 

लिख सकता है लेकिन, लगता है कि मैं एक समारोह है कि सच वापस आ जाएगी चाहते हैं की अपरकेस मान तारों में "एबीसी" होता है। मैं पूरे सरणी को अपरकेस कर सकता था, लेकिन ऐसा लगता है कि .Contains विधि में तुलना निर्दिष्ट करने के लिए कुछ ओवरलोड हैं, लेकिन मैं वाक्यविन्यास से उलझन में हूं।

मैं इस तर्क को लागू करने के लिए IEnumerable<string>.Contains() विधि का उपयोग कैसे कर सकता हूं?

strings.Contains("ABC", StringComparer.InvariantCultureIgnoreCase) 

इसके अलावा वहाँ है बॉक्स जो आप उपयोग कर सकते हैं में strings comparer:

+1

मुझे ज़ोर देना चाहिए कि मुझे पता है कि मैं 'स्ट्रिंग्स। चयन (एस => एस। टॉपर) लिख सकता हूं। ("एबीसी") ', लेकिन मैं जानना चाहता हूं कि बिना' कॉन्टेन्स 'का उपयोग करना संभव है सरणी को अपरकेस करना –

+1

न ही आपको [तुर्की i Problem] की वजह से किसी भी आवरण को बदलना चाहिए (http://haacked.com/archive/2012/07/05/turkish-i-problem-and-why-you-should-care.aspx/)। –

उत्तर

70

उपयोग Enumerable.Contains विधि है जो समानता comparer स्वीकार करता है अतिभारित।

1

मैं व्यक्तिगत रूप से की तरह इस आदमी के LambdaComparer, जो इस तरह सामान के लिए वास्तव में उपयोगी है:

LINQ Your Collections with IEqualityComparer and Lambda Expressions

उदाहरण उपयोग:

var comparer = new LambdaComparer<string>(
    (lhs, rhs) => lhs.Equals(rhs, StringComparison.InvariantCultureIgnoreCase)); 

var seq = new[]{"a","b","c","d","e"}; 

Debug.Assert(seq.Contains("A", comparer)); 
0

आप या तो पसंद करते हैं किसी कारण से या करने के लिए मजबूर कर रहे हैं StringComparison का उपयोग करें और StringComparer नहीं, आप निम्नानुसार एक एक्सटेंशन विधि जोड़ सकते हैं:

public static bool Contains(this IEnumerable<string> items, string value, StringComparison stringComparison) 
{ 
    StringComparer stringComparer; 

    switch (stringComparison) 
    { 
     case StringComparison.CurrentCulture: 
      stringComparer = StringComparer.CurrentCulture; 
      break; 
     case StringComparison.CurrentCultureIgnoreCase: 
      stringComparer = StringComparer.CurrentCultureIgnoreCase; 
      break; 
     case StringComparison.InvariantCulture: 
      stringComparer = StringComparer.InvariantCulture; 
      break; 
     case StringComparison.InvariantCultureIgnoreCase: 
      stringComparer = StringComparer.InvariantCultureIgnoreCase; 
      break; 
     case StringComparison.Ordinal: 
      stringComparer = StringComparer.Ordinal; 
      break; 
     case StringComparison.OrdinalIgnoreCase: 
      stringComparer = StringComparer.OrdinalIgnoreCase; 
      break; 
     default: 
      throw new NotImplementedException(); 
    } 

    return items.Contains(value, stringComparer); 
} 

इन्हें मानचित्र कैसे करें इस पर अधिक विविधता this question में मिल सकती है।