2010-10-13 15 views
44

mam ten kod:znaleźć, jeśli istnieje liczba całkowita w postaci listy liczb całkowitych

List<T> apps = getApps(); 

     List<int> ids; 

     List<SelectListItem> dropdown = apps.ConvertAll(c => new SelectListItem 
     { 
      Selected = ids.Contains(c.Id), 
      Text = c.Name, 
      Value = c.Id.ToString() 
     }).ToList(); 


ids.Contains 

wydaje się zawsze return false mimo że numery są zgodne

jakieś pomysły?

+9

Nie, to dość dużo, jak to zrobić. – mquander

+0

mquander ma rację - może możesz spróbować małego przykładu, takiego jak lista foo = nowa lista (); dla (int i = 0; i <10; ++ i) {foo.Add (i); } Console.WriteLine (foo.Contains (2)); –

+0

Zgaduję, że masz błąd w innym miejscu. To podejście POWINNO działać. –

Odpowiedz

68

Jeśli wystarczy prawdziwe/fałszywe wynik

bool isInList = intList.IndexOf(intVariable) != -1; 

jeśli intVariable nie istnieje na liście zwróci -1

+1

'IndexOf' jest oparte na zera. To powinno być '> = 0' :) –

+5

Lub tak naprawdę powinno po prostu sprawdzić'! = -1', ponieważ -1 wartość zwracana jest zdefiniowana jako wynik ujemny. –

+0

dzięki za komentarze, dobre punkty –

45

Dopóki lista jest inicjowany z wartościami i tej wartości faktycznie istnieje na liście, a następnie Contains powinien zwracać wartość true.

Próbowałem następujące:

var list = new List<int> {1,2,3,4,5}; 
var intVar = 4; 
var exists = list.Contains(intVar); 

I rzeczywiście istnieje, jest ustawiony na true.

+0

OP zaktualizował swoje pytanie, na które odpowiadasz. jego lista ids nie wydaje się być zainicjalizowana. Czy nie powinien to być hak kompilatora? –

+0

Tak. Niezainicjowana lista powinna spowodować błąd kompilatora. Ale nie jeśli lista jest zdefiniowana na poziomie klasy, to zostanie zainicjowana na wartość null i kompilator będzie zadowolony. –

3

Sposób, w jaki zrobiłeś, jest poprawny. Działa dobrze z tym kodem: x jest prawdziwe. Prawdopodobnie popełniłeś błąd gdzie indziej.

List<int> ints = new List<int>(new[] {1,5,7}); 
var i = 5; 
var x = ints.Contains(i); 
0

Powinieneś przedstawieniu Selected nie ids.Contains jak w ostatnim wierszu.

Właśnie zdałem sobie sprawę, że jest to kwestia formatowania, z PO. Niezależnie od tego powinieneś odwoływać się do wartości w Wybranym. Polecam dodanie niektórych wywołań Console.WriteLine, aby zobaczyć dokładnie, co jest drukowane w każdej linii, a także jaka jest każda wartość.

Po aktualizacji: ids jest pustą listą, w jaki sposób nie powoduje to wystąpienia wyjątku NullReferenceException? Ponieważ nigdy nie został zainicjowany w tym bloku kodu:

3

Oto metoda rozszerzenia, która umożliwia kodowanie jak polecenie SQL IN.

public static bool In<T>(this T o, params T[] values) 
{ 
    if (values == null) return false; 

    return values.Contains(o); 
} 
public static bool In<T>(this T o, IEnumerable<T> values) 
{ 
    if (values == null) return false; 

    return values.Contains(o); 
} 

Pozwala to rzeczy tak:

List<int> ints = new List<int>(new[] {1,5,7}); 
int i = 5; 
bool isIn = i.In(ints); 

Lub:

int i = 5; 
bool isIn = i.In(1,2,3,4,5); 
1
bool vExist = false; 
int vSelectValue = 1; 

List<int> vList = new List<int>(); 
vList.Add(1); 
vList.Add(2); 

IEnumerable vRes = (from n in vListwhere n == vSelectValue); 
if (vRes.Count > 0) { 
    vExist = true; 
} 
Powiązane problemy