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