2012-01-05 14 views
15

Powiel możliwe:
C# if statements matching multiple valuesUproszczenie if (x == 1 || x == 2)

często znajduję się pisania kodu gdzie zmienna może być A lub B na przykład kiedy zadzwonić OnItemDataBound na powielacz:

protected void repeater_OnItemDataBound(object sender, RepeaterItemEventArgs e) 
{ 
    if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem) 
    {} 
} 

I wtedy często myślę, że musi być prostszy sposób to zrobić. Chciałbym napisać coś takiego:

if(x == (1 || 2)) 

SQL ma operatora IN (..), czy jest coś podobnego w C#?

WHERE x IN(1,2) 

Wiem, że mogę zamiast tego użyć instrukcji switch, ale to nie jest proste. Chcę, żeby to było zrobione w instrukcji If, jeśli to możliwe.

+0

Najbardziej czytelny sposób: 'if'. Najszybszy sposób: prawdopodobnie "przełącznik". Składnia, która rozwiązuje problem: COBOL: D –

+0

'if (e.Item.DataItem == null) return;' zamiast 'if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem) 'jest dużo łatwiejszy do zapisu, jeśli chodzi o repeatery bindów. –

Odpowiedz

7

Jeśli chcesz naśladować instrukcję SQL IN, możesz zrobić coś takiego ... w prostym przypadku posiadania 2 elementów, to prawdopodobnie nie jest prostsze, ale w przypadku większej liczby elementów z pewnością będzie.

(new[] { 1, 2 }).Contains(x); 
15

Myślę, że jest dobrze tak jak jest; jednak można zrobić coś takiego:

// note the array is actually mutable... just... don't change the contents ;p 
static readonly ListItemType[] specialTypes = 
    new[]{ListItemType.Item, ListItemType.AlternatingItem}; 

i sprawdzić przed:

if(specialTypes.Contains(e.Item.ItemType)) { 
    // do stuff 
} 

jednak podkreślić: Chciałbym faktycznie wystarczy użyć switch tutaj, jak switch na całkowite i teksty stałe ma specjalnego traktowania IL poprzez jump-tabel, dzięki czemu jest bardzo wydajny:

switch(e.Item.ItemType) { 
    case ListItemType.Item: 
    case ListItemType.AlternatingItem: 
     // do stuff 
     break; 
} 
+1

+1 dla instrukcji switch. Używałem tego w przeszłości, generalnie gdy zajmowałem się czymś więcej niż Item lub AlternatingItem, na przykład stopką lub nagłówkiem, ale użyłem go, ponieważ było jeszcze czystsze niż pisanie instrukcji if. –

0

Chyba nie ma zbyt wiele możliwych opcji f lub pojedynczy if, twój kod jest czytelny, a czysty, co jest najważniejsze.

Jeśli często spotykają if z większą warunku 3, można użyć

new List<..>{ condition1, condition2, ... ConditionN}.Any<>().

Coś w tym stylu.

12

można napisać metodę rozszerzenia takiego:

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

i nazwać tak:

1.In(2,3,4) 

Ale chciałbym powiedzieć, że nie jest to warte wysiłku.

+7

Interesujące apporach, ty można zapisać go jeszcze krócej za pomocą 'return values.Contains (x);' – martinstoeckli

1

można użyć następującej metody, znaleziono w this Answer

public static bool In<T>(this T source, params T[] list) 
{ 
    if(null==source) throw new ArgumentNullException("source"); 
    return list.Contains(source); 
} 

Wezwania tak:

if(x.In(1,2,4)) 
{ 
     // ... 
} 
0

myślę, że jest tak proste, jak masz zamiar dostać. Zauważ, że inne odpowiedzi, a nawet własna sugestia, używają specjalnych konstrukcji i obejść, aby skrócić nieco trywialną składnię. Te sprytne obejścia ograniczą wydajność.

Ale w przypadku dwóch lub trzech elementów, które zużywają dużo miejsca, chciałbym umieścić warunki na kolejnych liniach, aby odczyt był nieco łatwiejszy.

if (x == MyEnum.SomeReallyLongNameThatEatsUpTheLine || 
    x == MyEnum.TheOtherNameThatWastesSpace) 
{ 
// The simplest code. 
} 

Domyślam się, że jeśli masz bardzo długą listę możliwych wartości, podejście do tablicy jest znacznie lepsze.

Powiązane problemy