2014-08-28 49 views
0

我正在做一個SignalRWPF應用程序。我從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 2014-08-28 20:43:35

+0

我不明白這個代碼。這是正確的方式來使用if語句作爲我的操作嗎?代碼: if(res!= null) { //我的代碼 } – 2014-08-28 20:51:36

+0

順便說一句 - 你什麼意思「沒有工作」?結果是什麼,你需要什麼? – sondergard 2014-08-28 21:29:21

回答

1

只要目標字符串具有相同的大小寫(大寫字母與小寫字母),嘗試1就應該正常工作。此搜索是區分大小寫這意味着它不會找到「On」,「oN」或「ON」,因爲它們具有不同的腸衣。爲了不區分大小寫的搜索,你可以使用的IndexOf代替,這需要一個StringComparison參數:

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

嘗試沒有2發現它匹配「的」第一個字符串的開始位置(再 - 區分大小寫)...這沒有任何意義,因爲任何完全匹配「on」的字符串總是會開始一個位置0.

嘗試3號與1號嘗試相同,但將結果轉換爲列表(其中返回IEnumerable)

嘗試4號本質上試圖找到「真」或「假」的起始位置。如果找到字符串「on」(同樣只有精確匹配),Contains方法將返回true,並將結果轉換爲字符串並傳遞給IndexOf。

UPDATE

其中返回一個IEnumerable(找到所有匹配項)。如果你只需要檢查,如果「上」的存在,你可以使用任何:

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

Im通過單擊按鈕發送「開」和「關」消息。我想讓我的wpf應用程序識別這些消息。目前爲止沒有任何工作我應該改變我的視圖模型嗎? – 2014-08-28 21:16:08

+0

如果您確定您正在將「開」/「關」置於消息中,則問題必須出現在其他地方。使用第一次嘗試應該工作。你能提供更多的上下文和代碼嗎? – sondergard 2014-08-28 21:21:44

+0

我發現我的錯誤 我用這個_dataHub.Subscribe(「ReceiveMessage」)更改了我的代碼。 並添加了這個和列表附帶有一些對象。但我不知道如何使用if語句 列表 asd = App.MainViewModel.Messages.Where(a => a.Contains(「on」))。ToList() – 2014-08-28 21:38:12

0

如果你正在處理的案件,並沒有一個異步的問題,下面的代碼工作。

Check out this post

Extension method,從崗位basicly拍攝。

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

您的兩個代碼都會給出錯誤,表明'string'不包含'Contains'的定義 – 2014-08-28 21:19:16

+0

@MustafaÖzgüner,您必須將靜態類添加到[擴展方法](http://msdn.microsoft.com/en-us//library/bb383977.aspx),以使其工作。它所做的是將新方法添加到現有的字符串類中,非常方便。 – 2014-08-28 21:20:43