我正在使用 SignalR WPF 应用程序。我从Windows Phone发送消息。我想找到该系列中的特定项目。
我的观点模型:
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 :(得分:1)
尝试no 1应该可以正常工作,只要目标字符串具有相同的大小写(UPPERCASE vs lowercase)。此搜索区分大小写意味着它不会找到“开”,“开”或“开”,因为它们有不同的外壳。要进行不区分大小写的搜索,可以使用IndexOf,它接受StringComparison参数:
var asd2 = App.MainViewModel.Messages.Where(a => a.IndexOf("on", StringComparison.CurrentCultureIgnoreCase) >= 0);
尝试no 2找到匹配“on”的第一个字符串的起始位置(再次 - 区分大小写)...这没有任何意义,因为任何完全匹配“on”的字符串将始终启动位置0。
尝试no 3与尝试no 1相同,但将结果转换为列表(Where返回IEnumerable)
尝试no 4基本上试图找到“true”或“false”的起始位置。如果找到字符串“on”(再次只是完全匹配),则Contains方法将返回true,并且该结果将转换为字符串并传递给IndexOf。
更新
返回IEnumerable(找到所有匹配项)。如果您只需要检查是否存在“on”,则可以使用Any:
bool containsOn = App.MainViewModel.Messages.Any(a => a.IndexOf("on", StringComparison.CurrentCultureIgnoreCase) >= 0);
答案 1 :(得分:0)
如果您正在处理案件并且没有异步问题,则以下代码可以使用。
Extension method ,基本上从帖子中删除。
public static class StringExt
{
public static bool Contains(this string source, string toCheck, StringComparison comp)
{
return source.IndexOf(toCheck, comp) >= 0;
}
}
请注意,上面的扩展方法会找到&#34; on&#34;无论如何,添加或修改方法以满足您的需求,让生活更轻松:)我个人喜欢它们!
然后搜索
// 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
答案 2 :(得分:0)
像这样的字符串发送消息真的不太理想。也许看看这个使用Event聚合模式的库?
免责声明:我是作者
https://github.com/AndersMalmgren/SignalR.EventAggregatorProxy/wiki