2015-01-22 1 views
1

У меня есть IEnumerable<TextBox>. Один из элементов имеет Tag. Я хочу, чтобы фильтровать мой первый IEnumerable таким образом:Запрос Linq: когда условие дает пустую последовательность, даже если должно быть одно совпадение

IEnumerable<TextBox> longDescContainersTag = 
    longDescContainers.Where(i => i.Tag == "DescrOp"); 

где условие не работает, он просто не находит TextBoxes, последовательность пуста. Но если я быстро просмотрю longDescContainers, у него есть элемент с тегом «DescrOp».

У вас есть предложения?

+7

Добавить '.ToList()' в конце – Milen

+2

Вы можете указать «не работает»? –

+1

Определить "* не работает *"? Включите небольшой фрагмент кода, который воспроизводит проблему. Проверка у вас на данный момент чувствительна к регистру ... просто мысль. – James

ответ

4

Это не ясно из Вашего вопроса, но я предполагаю, что ваш where -условию является правильным, но вы не» t получить какой-либо результат, хотя исходная коллекция содержит элемент, где условие должно соответствовать.

Я говорю должен потому что Control.Tag является объектом, и использование i.Tag == "DescrOp" будет делать сравнения по ссылке, а не по значению.

Это может привести или не вернуть true, даже если строки равны. То, что вы должны сделать, - это лить i.Tag для первой строки, то есть (string)i.Tag == "DescrOp".

+0

Хороший улов, хотя я уверен, что интернирование строк делает их одинаковыми. –

+0

Это то, что я сказал помощнику, но было ниспровергнуто, не знаю, почему .. – bit

+0

@bit: вы получили downvotes на исходный ответ, который был: _ «Вам нужно смотреть« longDescContainersTag », а не« longDescContainers »_ –

0

Предполагая, что ваш longDescContainers является коллекцией TextBox. Я подозреваю, что сравнение Tag (объекта) к "DescrOp" (строка) не .. Попробуйте использовать ToString() ..

IEnumerable<TextBox> longDescContainersTag = longDescContainers.Where(i => i.Tag!=null && i.Tag.ToString() == "DescrOp"); 
+0

Точка, которую делает OP, это проверка 'longDescContainers', и у нее есть элемент, который * должен * соответствовать фильтру, но это не так. – James

+0

@James, Мой плохой. спасибо за указание – bit

+0

Downvotes? Позаботьтесь об этом? – bit

1

1- Вы уверены, что .Tag содержит строковое значение? В некоторых случаях, когда мы смотрим окно с часами, отображается имя объекта. Фактически cals «ToString()» метод объекта и показывает его. Я думаю, вы можете использовать этот код:

IEnumerable<TextBox> longDescContainersTag = 
    longDescContainers.Where(i => i.Tag.ToString() == "DescrOp"); 

2- Вы уверены, что все объекты в «longDescContainers» имеет тип «TextBox»? Я не знаю, что такое объект longDescContainers, но в некоторых контейнерных объектах нам нужно отбросить их элементы (элементы управления), подобные этому «longDescContainers.cast<TextBox>().where(....)». Если вы не уверены, что все объекты в «longDescContainers» является TextBox, вы можете попробовать этот код:

IEnumerable<TextBox> longDescContainersTag = longDescContainers. 
    Where(i => i.GetType() == typeof(TextBox) && i.Tag == "DescrOp"). 
Select(t=> (TextBox)t); 

Если longDescContainersTag содержит еще какой-либо объект «TextBox» типа, что тег «DescrOp» код выше возвращает его.

Вы можете использовать соединение «1» и «2» и используйте следующий код:

IEnumerable<TextBox> longDescContainersTag = longDescContainers. 
    Where(i => i.GetType() == typeof(TextBox) && i.Tag.ToString() == "DescrOp") 
.Select(t=> (TextBox)t);