【问题标题】:How can I find partially-matching values in an ObservableCollection?如何在 ObservableCollection 中找到部分匹配的值?
【发布时间】:2016-06-29 15:05:12
【问题描述】:

我想在我的ObservableCollection 中搜索我能找到的特定项目的任何匹配项。在这种情况下,我的项目是“艺术家”。基本上它只是一个搜索栏,用户可以在其中输入艺术家姓名。

我这样做了,它可以工作,但用户必须输入完全相同的值:

   //user type "david guetta"
   if (myCollection.Any(x => x.artist== input.Value))
   {
       //...
   }

如何在我的收藏中找到部分匹配项,用户可以在其中键入“david”并检索包含此字符串的所有艺术家?

我尝试将正则表达式与字符串数组一起使用,效果也很好,但我无法对我的集合做同样的事情。

string[] artists=
{
    "Malcom George",
    "Willis H. David",
    "David Bowie",
    "Davidson"
};

string pattern = input.Value;

foreach (string s in artists)
{
    if (Regex.IsMatch(s, pattern, RegexOptions.IgnoreCase))
    {
       // ...
    }
}

【问题讨论】:

  • 除了能够在提供项目的部分但不是全部单词时检索结果(这可以通过 Matteo 在他的回答中建议的内容来完成),您可能有兴趣考虑nuget [模糊逻辑] 包之一 (nuget.org/packages/DuoVia.FuzzyStrings) 使您的应用能够在仅提供真实数据的近似值时返回结果。

标签: c# .net regex observablecollection


【解决方案1】:

您可以在 Any 的谓词中检查,而不是相等比较,只需检查 string 是否包含输入 string

你可以这样做:

myCollection.Any(x => x.artist.Contains(input.Value))

如果您需要不区分大小写的搜索,您可以执行以下操作:

myCollection.Any(x => x.artist.IndexOf(input.Value, StringComparison.InvariantCultureIgnoreCase) >= 0)

要获取对象,可以使用 Where 方法而不是 Any

myCollection.Where(x => x.artist.Contains(input.Value))

myCollection.Where(x => x.artist.IndexOf(input.Value, StringComparison.InvariantCultureIgnoreCase) >= 0)

【讨论】:

  • 您的解决方案工作正常,但是当我得到匹配项时如何检索整个对象?我还有其他项目,例如标题、年份 ...
  • @ozer 你的意思是你想根据输入字符串检查每个成员(标题,年份...)?
  • 是的,输入字符串将是我获得匹配项时获取整个对象的索引
  • @ozer 然后您需要在谓词中添加or 条件并检查那里的字段。喜欢:x => x.artist.Contains(input.Value) || x => x.title.Contains(input.Value) 等等...
  • 我明白了,但这并不是我真正想要的。现在我得到了匹配,我想得到那个匹配的索引,这样我就可以浏览我的 obsevablecollection 并获取整个对象
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-06-06
  • 2021-05-07
  • 1970-01-01
  • 1970-01-01
  • 2020-07-04
  • 2023-02-21
  • 2021-07-26
相关资源
最近更新 更多