在ObservableCollection中搜索特定项

时间:2014-08-28 20:08:06

标签: c# wpf windows-phone signalr

我正在使用 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());

现在没有用。请帮忙。

编辑:这个网站上的答案对我没用。我不知道问题出在哪里

3 个答案:

答案 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)

如果您正在处理案件并且没有异步问题,则以下代码可以使用。

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;
    }
}

请注意,上面的扩展方法会找到&#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