在ObservableCollection中搜索具体的项目
我正在做一个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());
没有什么工作现在。请帮忙 。
编辑:这个网站的答案没有为我工作。我不知道问题出在哪里
只要目标字符串具有相同的大小写(大写字母与小写字母),尝试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);
Im通过单击按钮发送“开”和“关”消息。我想让我的wpf应用程序识别这些消息。目前为止没有任何工作我应该改变我的视图模型吗? – 2014-08-28 21:16:08
如果您确定您正在将“开”/“关”置于消息中,则问题必须出现在其他地方。使用第一次尝试应该工作。你能提供更多的上下文和代码吗? – sondergard 2014-08-28 21:21:44
我发现我的错误 我用这个_dataHub.Subscribe(“ReceiveMessage”)更改了我的代码。 并添加了这个和列表附带有一些对象。但我不知道如何使用if语句 列表
如果你正在处理的案件,并没有一个异步的问题,下面的代码工作。
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
您的两个代码都会给出错误,表明'string'不包含'Contains'的定义 – 2014-08-28 21:19:16
@MustafaÖzgüner,您必须将静态类添加到[扩展方法](http://msdn.microsoft.com/en-us//library/bb383977.aspx),以使其工作。它所做的是将新方法添加到现有的字符串类中,非常方便。 – 2014-08-28 21:20:43
发送消息像这样的字符串是真的不理想。也许看看这个使用事件聚合模式的库?
免责声明:我是作者
https://github.com/AndersMalmgren/SignalR.EventAggregatorProxy/wiki
难道是微不足道的外壳的东西吗?你有没有试图忽略大小写? var res = App.MainViewModel.Messages.Where(a => a.IndexOf(“on”,StringComparison.CurrentCultureIgnoreCase)> = 0); – sondergard 2014-08-28 20:43:35
我不明白这个代码。这是正确的方式来使用if语句作为我的操作吗?代码: if(res!= null) { //我的代码 } – 2014-08-28 20:51:36
顺便说一句 - 你什么意思“没有工作”?结果是什么,你需要什么? – sondergard 2014-08-28 21:29:21