2010-10-13 6 views
44

у меня есть этот код:найти, если целое число существует в списке целых чисел

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 

, кажется, всегда возвращает ложь, даже несмотря на то цифры не соответствуют

какие-нибудь идеи?

+9

Нет, это довольно много, как вы это делаете. – mquander

+0

mquander прав - возможно, вы можете попробовать небольшой пример, такой как List foo = new List (); for (int i = 0; i <10; ++ i) {foo.Add (i); } Console.WriteLine (foo.Contains (2)); –

+0

Я предполагаю, что у вас есть ошибка в другом месте. Этот подход СЛЕДУЕТ работать. –

ответ

68

Если вам нужен только истинный/ложный результат

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

если intVariable не существует в списке он будет возвращать -1

+1

'IndexOf' основан на нулевом значении. Это должно быть '> = 0' :) –

+5

Или действительно нужно просто проверить'! = -1', поскольку возвращаемое значение -1 определяется как отрицательный результат. –

+0

благодарит за комментарии, хорошие моменты –

45

Пока ваш список инициализируется со значениями, и это значение фактически существует в списке, тогда Contains должен возвращать true.

Я попробовал следующее:

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

И существует действительно установлен верно.

+0

OP обновил свой вопрос, на который вы отвечаете. его список идентификаторов не представляется инициализированным. Разве это не компилятор? –

+0

Да. Неинициализированный список должен вызывать ошибку компилятора. Но нет, если список определен на уровне класса, тогда он будет инициализирован нулем, и компилятор будет счастлив. –

3

То, как вы это сделали, является правильным. Он отлично работает с этим кодом: x истинно. Возможно, вы допустили ошибку в другом месте.

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

Вы должны быть ссылки Selected не ids.Contains как в последней строке.

Я только что понял, что это проблема форматирования, от OP. Независимо от того, вы должны ссылаться на значение в Selected. Я рекомендую добавить некоторые вызовы Console.WriteLine, чтобы точно увидеть, что распечатывается в каждой строке, а также то, что каждое значение.

После вашего обновления: ids - это пустой список, как это не бросает исключение NullReferenceException? Поскольку он никогда не инициализировался в этом кодовом блоке

3

Вот метод расширения, это позволяет кодировать, как команда 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); 
} 

Это позволяет тому подобное:

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

Или:

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; 
} 
Смежные вопросы