我想測試某個字符串是否包含在一個簡短的字符串列表中。目前代碼是這樣的:有沒有更好的方法來寫新的列表<string> {「a」,「b」}。包含(str)?
if (new List<string> { "A", "B", "C" }.Contains (str)) {
但是,這似乎臃腫。例如,iirc,在Java中,我可以簡單地寫{"A", "B", "C"}.Contains(str)
這比上面的更好。
我相信在C#中有更好的方法。你能指出嗎?
我想測試某個字符串是否包含在一個簡短的字符串列表中。目前代碼是這樣的:有沒有更好的方法來寫新的列表<string> {「a」,「b」}。包含(str)?
if (new List<string> { "A", "B", "C" }.Contains (str)) {
但是,這似乎臃腫。例如,iirc,在Java中,我可以簡單地寫{"A", "B", "C"}.Contains(str)
這比上面的更好。
我相信在C#中有更好的方法。你能指出嗎?
你可以寫一個擴展方法:
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")) { ... }
我猜你會縮短它歸結爲:
if ((new []{ "A", "B", "C" }).Contains (str)) {
不知道會是多少實際差異做出,但。
更新:如果你知道你會爲只有一個字母來測試,我認爲沒有理由做出它的列表或數組:
if ("ABC".Contains(str)) {
該代碼是既短,速度更快。但是,有一次我猜單字母串僅僅是樣品......
如果你的短字符串列表是不變的,你應該使用一個靜態只讀字符串數組。
好處是它很容易編寫,並且每次需要執行檢查時都不會實例化新列表。
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) {
從性能POV,我喜歡你的解決方案。但是,我主要關心的是代碼長度。 – mafu 2009-08-27 09:12:52
要徹底改變它:
switch(str){
case "A":
case "B":
case "C":
contains = true;
break;
default:
contains = false;
break;
}
太多代碼:) – mafu 2009-08-27 09:14:33
只是提供替代:) – 2009-08-27 09:19:04
一個有趣的方法。現在我更喜歡Fredrik的第二個解決方案,但我會牢記你的想法。+1 – mafu 2009-08-27 09:16:14
無論如何決定接受這個答案,因爲它更通用。 – mafu 2009-09-07 11:12:34