3

そこにいくつかのコードを投げるためだけに

string answer = "hotel"
if (answer == "house"|| answer == "hotel" || answer =="appartment")
{
    DoSomething()
}

それを短くする方法があるかどうか疑問に思っていました

string answer = "hotel"
if (answer == "house"|| "hotel" || "appartment")
{
    DoSomething()
}

私はswitch文を知っています

switch (answer)
{
    case "house":
    case "hotel":
    case "appartment": DoSomething();
        break;
    default :DoNothing();
}

上で説明したような構文糖衣があるかどうか疑問に思っています。

4

10 に答える 10

8

これにはシンタックス シュガーを使用できます。

if((new[]{"house", "hotel", "apartment"}).Contains(answer))
{
}

Booleanこれにより、その場で新しい配列が作成されるため、チェックだけよりもコストがかかる可能性があることに注意してください。

于 2012-05-08T13:04:57.247 に答える
7

配列を使用して、Contains を使用できます。

あなたの例では:

string answer = "hotel";
string[] acceptable = new string[]{"house", "hotel", "appartment"};
if (acceptable.Contains(answer)){
    DoSomething();
}
于 2012-05-08T13:05:58.853 に答える
4
public static bool Any<T>(T item, params T[] items)
{
    return items.Contains(item);
}

使用法:

if (Any(6, 1, 2, 3, 4, 5, 6, 7))
{
    // 6 == 6
}

if (Any("Hi", "a", "cad", "asdf", "hi"))
{
}
else
{
    // "Hi" != "hi" and from anything else.
}

または:

public string[] items = new string[] {"a", "cad", "asdf", "hi"};

...

if (Any("Hi", items))
{
    Works just as well.
}

より高度な比較もできます。たとえば、次のようにします。

if (person.Name == p1.Name ||
    person.Name == p2.Name ||
    person.Name == p3.Name ||
    person.Name == p4.Name ||
    person.Name == p5.Name || ...)
{
}

あなたが持つことができます:

public static bool Any<T>(T item, Func<T, T, bool> equalityChecker, params T[] items)
{
    return items.Any(x => equalityChecker(item, x));
}

そして、やります:

if (Any(person, (per1, per2) => p1.Name == p2.Name, p1, p2, p3, p4, p5, ...)
{
}

編集

もちろん、それを拡張メソッドにすることもできます。

public static bool Any<T>(this T item, params T[] items)
{
    return items.Contains(item);
}

使用法:

var b = 6.Any(4, 5, 6, 7); // true

そして、シグネチャにキーワード「item」を追加する同じロジックが、equalityChecker を使用したオーバーロードにも適用されます。

于 2012-05-08T13:09:09.383 に答える
3

グローバル リストを作成し、任意の方法でチェックするだけです。

List<string> validAnswers = new List<string> {"house", "house1", "apartment"};

if (validAnswers.Contains(answer))
    DoSomething();

この場合、チェックListするたびに生成されるわけではありませんanswer

于 2012-05-08T13:05:03.407 に答える
2

私が考えることができる唯一のことは、リストまたは配列を操作することです:

List<String> words = new List<String> { "house", "hotel", "appartment" };
String answer = "house";

if (words.Contains(answer))
{
   DoSomething();
}
于 2012-05-08T13:05:36.653 に答える
1

任意の文字列を受け入れる拡張メソッドを追加することを検討してください...

string answer = "hotel"
if (answer.EqualsAny("house", "hotel", "appartment"))
{
    DoSomething()
}
// Extending the thought to another version
if (answer.EqualsAll("house", "hotel", "appartment"))
{
    DoSomething()
}

public static class Extensions
{
    public static bool EqualsAny(this string value, params string[] compareAgainst)
    {
        foreach (var element in compareAgainst)
        {
            if(value == element)
               return true;
        }
        return false;
    }
    public static bool EqualsAll(this string value, params string[] compareAgainst)
    {
        foreach (var element in compareAgainst)
        {
            if(value != element)
                return false;
        }
        return true;
    }
}
于 2012-05-08T13:12:27.570 に答える
1

あなたは好きにすることができます

if(new string[]{"house","hotel","appartment"}.Contains(asnwer))
{
...
}

また

if(new List<string>(){"house","hotel","appartment"}.Any(x=>x == answer)
{
}

これも拡張メソッドのように追加して、使用できます...

于 2012-05-08T13:05:38.270 に答える
0

比較パラメーターが固定されている場合は、フラグ付きのENUMを選択できます。MSDNを参照してください。次に、目的の動作を行うことができます。この投稿も参照できます

于 2012-05-08T13:09:47.200 に答える
0

次のような拡張メソッドを使用します。

public static bool In<T>(this T item, params T[] items)
{
    return items.Contains(item);
}

次のように使用します。

if ("hotel".In("house", "hotel", "apartment"))
or
if (1.In(1,2))
于 2012-05-11T21:59:25.903 に答える
0

この場合、通常はswitchステートメントを使用しますが、上記のいくつかの回答ですでに述べたように、結果をリストまたは配列に入れてその方法でチェックできます。

于 2012-05-08T13:15:37.717 に答える