2014-08-28 52 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