2014-08-28 3 views
0

Я работаю над SignalRWPF приложение. Im отправка сообщений с Windows Phone. Я хочу найти конкретный элемент в этой коллекции.Поиск определенного элемента в ObservableCollection

мой взгляд модель:

public ViewModel() 
    { 
     Messages = new ObservableCollection<string>(); 

     _connection = new HubConnection("http://localhost:49671/"); 
     _dataHub = _connection.CreateHubProxy("dataHub"); 
    } 

    public ObservableCollection<string> Messages 
    { 
     get { return _messages; } 
     set 
     { 
      if (Equals(value, _messages)) return; 
      _messages = value; 
      OnPropertyChanged("Messages"); 
     } 
    } 
    public async Task Login(string roomName, string userName) 
    { 
     _userName = userName; 
     _roomName = roomName; 

     await _connection.Start(); 
     await _dataHub.Invoke("JoinRoom", new object[] { _roomName, _userName }); 
     _dataHub.Subscribe("ReceiveMessage").Received += list => 
     Dispatcher.CurrentDispatcher.BeginInvoke((Action)(() => 
     Messages.Add(list[0].ToString()))); 
    } 

коды, которые я пытался не искать

var asd2 = App.MainViewModel.Messages.Where(a => a.Contains("on")); 
var on = App.MainViewModel.Messages.IndexOf(App.MainViewModel.Messages.Where(x => x == "on").FirstOrDefault()); 
List<string> asd = App.MainViewModel.Messages.Where(a => a.Contains("on")).ToList(); 
var q = App.MainViewModel.Messages.IndexOf(App.MainViewModel.Messages.Contains("on").ToString()); 

ничего работал на данный момент. Пожалуйста помоги .

Редактировать: ответ на этом сайте не работал для меня. Я не знаю, где проблема

+0

Может быть что-то, как тривиальный, как кожух? Вы пытались игнорировать дело? var res = App.MainViewModel.Messages.Where (a => a.IndexOf ("on", StringComparison.CurrentCultureIgnoreCase)> = 0); – sondergard

+0

Я не очень понял этот код. Это правильный способ использовать оператор if для моих операций? Код: if (res! = Null) { // мой код } –

+0

Btw - что вы на самом деле имеете в виду «ничего не работает»? Какой результат получается, и что вам нужно? – sondergard

ответ

1

Попытка № 1 должна работать нормально, если целевая строка имеет тот же корпус (UPPERCASE vs lowercase). Этот поиск с учетом регистра означает, что он НЕ найдет «On», «oN» или «ON», потому что у них разные оболочки. Для того, чтобы без учета регистра поиска, вы можете использовать вместо IndexOf, который принимает параметр StringComparison:

var asd2 = App.MainViewModel.Messages.Where(a => a.IndexOf("on", StringComparison.CurrentCultureIgnoreCase) >= 0); 

Попытка № 2 находит начальную позицию первой строки, которая соответствует «на» (опять-таки - чувствительно к регистру) ... Это не имеет никакого смысла, так как любая строка, которая точно соответствует «on», всегда будет начинать позицию 0.

Попытка no 3 делает то же, что и попытка № 1, но преобразует результат в список (Where возвращает IEnumerable)

Попытка № 4 по существу пытается найти исходное положение либо «истина», либо «ложь». Метод Contains возвращает true, если найдена строка «on» (снова только точное совпадение), и этот результат преобразуется в строку и передается в IndexOf.

UPDATE

Где возвращает IEnumerable (с найдены все матчи). Если вам нужно только проверить, если «на» существует, то вы можете использовать любого:

bool containsOn = App.MainViewModel.Messages.Any(a => a.IndexOf("on", StringComparison.CurrentCultureIgnoreCase) >= 0); 
+0

Im посылает сообщения «on» и «off», нажимая кнопки. И я хочу, чтобы мое приложение wpf распознало эти сообщения. До сих пор ничего не работало. Должен ли я менять свои модели просмотра? –

+0

Если вы уверены, что вы помещаете «on»/«off» в «Messages», проблема должна быть в другом месте. Использование первой попытки должно работать. Можете ли вы предоставить больше контекста и кода? – sondergard

+0

Я нашел свою ошибку Я изменил свой код с помощью этого _dataHub.Subscribe («ReceiveMessage»). Received + = list => Messages.Add (список [0] .ToString()); и добавил это, и список поставляется с одним объектом. Но я не знаю, как использовать if statement Список asd = App.MainViewModel.Messages.Where (a => a.Contains ("on")). ToList() –

0

Если вы имеете дело с делами и не имеете проблем асинхронные, приведенный ниже код работает.

Check out this post

Extension method, взятый из почтового поясню.

public static class StringExt 
{ 
    public static bool Contains(this string source, string toCheck, StringComparison comp) 
    { 
     return source.IndexOf(toCheck, comp) >= 0; 
    } 
} 

Обратите внимание, что метод расширения выше будет найти все, что с «на» в нем, независимо от случая, добавить или изменить методы, чтобы удовлетворить ваши потребности, делает жизнь легче :) Я лично люблю их!

Тогда для поиска

// get first message with on in it 
var res = App.MainViewModel.Messages.FirstOrDefault(m => m.Contains("on", StringComparison.OrdinalIgnoreCase)); 
// get everything with on in it 
var res2 = App.MainViewModel.Messages.Where(m => m.Contains("on", StringComparison.OrdinalIgnoreCase)); 

Надеется, что это помогает, и был то, что вы были после

Приветствий

Stian

+0

оба ваших кода, дающие ошибки, говорящие «строка», не содержат определения для «Содержит» –

+0

@ MustafaÖzgüner, вы должны добавить статический класс с помощью [метод расширения] (http://msdn.microsoft.com/en-us//library/bb383977.aspx) в вашем пространстве имен, чтобы заставить его работать. То, что он делает, это добавить новый метод в существующий класс строк, весьма удобный. –

0

Отправка сообщения в виде строки, как это на самом деле не является идеальным. Может быть, посмотрите на эту библиотеку, которая использует шаблон агрегации событий?

Отказ от ответственности: Я автор

https://github.com/AndersMalmgren/SignalR.EventAggregatorProxy/wiki

Смежные вопросы