C# 从提供的数据修复字符串

C# 从提供的数据修复字符串,c#,regex,C#,Regex,假设我在一个充满字符串的列表中有这些项目: 现金 支票 邮政汇票 信用卡 银行转账 等等。。。等等等 我发现了一个叫做“LevenshteinDistance”的好东西。 这在某种程度上是可行的。如果输入错误,它并不总是返回正确的字符串 我正在考虑去Regex那边买这个 基本上我想输入,例如,“chq”,它应该返回“支票” 我有此代码尝试此操作,但它也无法正常工作: foreach (string entry in lsbSuppliedData.Items) { entr = en

假设我在一个充满字符串的列表中有这些项目:

  • 现金
  • 支票
  • 邮政汇票
  • 信用卡
  • 银行转账
  • 等等。。。等等等
我发现了一个叫做“LevenshteinDistance”的好东西。 这在某种程度上是可行的。如果输入错误,它并不总是返回正确的字符串

我正在考虑去Regex那边买这个

基本上我想输入,例如,“chq”,它应该返回“支票”

我有此代码尝试此操作,但它也无法正常工作:

foreach (string entry in lsbSuppliedData.Items)
{
    entr = entry.Trim().Replace(" ", "");
    regex = new Regex("^[" + inputString + "]+$", RegexOptions.IgnoreCase);

    if (regex.IsMatch(inputString))
    {
        proposal = entry;
        //break;
    }
}
有人能帮我找到正确的方向吗?我有一个列表,其中列出了它应该建议的项目,最多20个项目(不是很大,所以性能不是大问题)。

您可以尝试以下方法:

var words = new[] { "Cash", "Cheque" ... };

string search = "chq";

var results = words
             .Where(x => x.ToLower()
                        .Intersect(search.ToLower().Distinct()).Count() >= search.Length);
如果您键入
cqh
,它仍将返回
支票
,如果您不希望发生这种情况,则会忽略大小写敏感度以及ex的字母顺序,它需要做更多的工作。如果要获得单个结果而不是所有匹配项,还可以将
Where
更改为
First
FirstOrDefault

更新:以下是另一个不忽略字母顺序的版本:

var result = words
            .FirstOrDefault(x => x.ToLower().Where(search.Contains).SequenceEqual(search));
您可以尝试以下方法:

var words = new[] { "Cash", "Cheque" ... };

string search = "chq";

var results = words
             .Where(x => x.ToLower()
                        .Intersect(search.ToLower().Distinct()).Count() >= search.Length);
如果您键入
cqh
,它仍将返回
支票
,如果您不希望发生这种情况,则会忽略大小写敏感度以及ex的字母顺序,它需要做更多的工作。如果要获得单个结果而不是所有匹配项,还可以将
Where
更改为
First
FirstOrDefault

更新:以下是另一个不忽略字母顺序的版本:

var result = words
            .FirstOrDefault(x => x.ToLower().Where(search.Contains).SequenceEqual(search));
您可以尝试以下方法:

var words = new[] { "Cash", "Cheque" ... };

string search = "chq";

var results = words
             .Where(x => x.ToLower()
                        .Intersect(search.ToLower().Distinct()).Count() >= search.Length);
如果您键入
cqh
,它仍将返回
支票
,如果您不希望发生这种情况,则会忽略大小写敏感度以及ex的字母顺序,它需要做更多的工作。如果要获得单个结果而不是所有匹配项,还可以将
Where
更改为
First
FirstOrDefault

更新:以下是另一个不忽略字母顺序的版本:

var result = words
            .FirstOrDefault(x => x.ToLower().Where(search.Contains).SequenceEqual(search));
您可以尝试以下方法:

var words = new[] { "Cash", "Cheque" ... };

string search = "chq";

var results = words
             .Where(x => x.ToLower()
                        .Intersect(search.ToLower().Distinct()).Count() >= search.Length);
如果您键入
cqh
,它仍将返回
支票
,如果您不希望发生这种情况,则会忽略大小写敏感度以及ex的字母顺序,它需要做更多的工作。如果要获得单个结果而不是所有匹配项,还可以将
Where
更改为
First
FirstOrDefault

更新:以下是另一个不忽略字母顺序的版本:

var result = words
            .FirstOrDefault(x => x.ToLower().Where(search.Contains).SequenceEqual(search));


到底是什么工作不正常?您正在寻找这样的soundex搜索功能吗?到底是什么工作不正常?您正在寻找这样的soundex搜索功能吗?到底是什么工作不正常?您正在寻找这样的soundex搜索功能吗?到底是什么工作不正常?您正在寻找这样的soundex搜索功能吗?您可以先使用
First()
,然后使用惰性求值来运行它faster@Hogan我猜他在寻找不止一个结果,好吧,但你只是返回了一个真-假,所以有语义上的差异吗?@Jonesy good point谢谢。Hogan我认为OP想要得到结果字符串,而不仅仅是true或false,基本上我想要输入,例如,“chq”,它应该返回“CHECK”_我在ToLower和search上出错了。我对LINQ不是很熟悉(如果这是LINQ的话)。您可以先使用
),然后使用惰性求值来运行它faster@Hogan我猜他在寻找不止一个结果,好吧,但你只是返回了一个真-假,所以有语义上的差异吗?@Jonesy good point谢谢。Hogan我认为OP想要得到结果字符串,而不仅仅是true或false,基本上我想要输入,例如,“chq”,它应该返回“CHECK”_我在ToLower和search上出错了。我对LINQ不是很熟悉(如果这是LINQ的话)。您可以先使用
),然后使用惰性求值来运行它faster@Hogan我猜他在寻找不止一个结果,好吧,但你只是返回了一个真-假,所以有语义上的差异吗?@Jonesy good point谢谢。Hogan我认为OP想要得到结果字符串,而不仅仅是true或false,基本上我想要输入,例如,“chq”,它应该返回“CHECK”_我在ToLower和search上出错了。我对LINQ不是很熟悉(如果这是LINQ的话)。您可以先使用
),然后使用惰性求值来运行它faster@Hogan我猜他在寻找不止一个结果,好吧,但你只是返回了一个真-假,所以有语义上的差异吗?@Jonesy good point谢谢。Hogan我认为OP想要得到结果字符串,而不仅仅是true或false,基本上我想要输入,例如,“chq”,它应该返回“CHECK”_我在ToLower和search上出错了。我对LINQ不是很熟悉(如果这是LINQ)。