2009-08-27 3 views

回答

6

你可以寫一個擴展方法:

public static bool In<T>(this T obj, params T[] candidates) 
{ 
    return obj.In((IEnumerable<T>)candidates); 
} 

public static bool In<T>(this T obj, IEnumerable<T> candidates) 
{ 
    if(obj == null) throw new ArgumentNullException("obj"); 
    return (candidates ?? Enumerable.Empty<T>()).Contains(obj); 
} 

然後你可以用做:

if(str.In("A", "B", "C")) { ... } 
+0

一個有趣的方法。現在我更喜歡Fredrik的第二個解決方案,但我會牢記你的想法。+1 – mafu 2009-08-27 09:16:14

+0

無論如何決定接受這個答案,因爲它更通用。 – mafu 2009-09-07 11:12:34

6

我猜你會縮短它歸結爲:

if ((new []{ "A", "B", "C" }).Contains (str)) { 

不知道會是多少實際差異做出,但。

更新:如果你知道你會爲只有一個字母來測試,我認爲沒有理由做出它的列表或數組:

if ("ABC".Contains(str)) { 

該代碼是既短,速度更快。但是,有一次我猜單字母串僅僅是樣品......

+0

這已經一個很大的改進。我想它也有點快。 – mafu 2009-08-27 08:11:41

+0

@mafutrct:我做了性能測試,看起來好像我的解決方案實際上比較慢。所以現在是短代碼或更快代碼的選擇; o) – 2009-08-27 08:17:45

+0

幸運的是,現在我實際上只需要測試單個字符。我怎麼可能錯過「ABC」.Contains ?! – mafu 2009-08-27 09:17:34

2

怎麼樣這種方法:

"A;B;C".Split(';').Contains(str); 
+0

它有點短,但也不太容易閱讀,而且性能可能更差。 – mafu 2009-08-27 08:10:43

+0

s /可能/當然/ - 不要把它粘在一個循環裏面...... – ijw 2009-08-27 08:33:58

+0

當然,性能會更差。如果它在操作的情況下是另一個問題:) – Christian 2009-08-27 08:37:21

2

如果你的短字符串列表是不變的,你應該使用一個靜態只讀字符串數組。

好處是它很容易編寫,並且每次需要執行檢查時都不會實例化新列表。

private static readonly string[] Names = new string[] { "A", "B", "C" }; 

... 

if (Names.Contains(str)) { 

但是,由於搜索是以線性方式完成的,因此該解決方案不具有可伸縮性。或者,您可以按排序方式定義常量數組,並在數組上使用BinarySearch。

// this has to be sorted 
private static readonly string[] Names = new string[] { "A", "B", "C" }; 

... 

if (Array.BinarySearch(Names, str) >= 0) { 
+0

從性能POV,我喜歡你的解決方案。但是,我主要關心的是代碼長度。 – mafu 2009-08-27 09:12:52

2

要徹底改變它:

switch(str){ 
    case "A": 
    case "B": 
    case "C": 
     contains = true; 
     break; 

    default: 
     contains = false; 
     break; 
} 
+0

太多代碼:) – mafu 2009-08-27 09:14:33

+0

只是提供替代:) – 2009-08-27 09:19:04

相關問題