[英]C# - Check if string contains characters of another string at the same order
[英]Check if string contains characters in certain order in C#r
我有一個可以立即使用的代碼,但是它不會檢查字符是否正確,它只會檢查字符是否在其中。 如何修改代碼,以便按字符串中的順序檢查字符“ gaoaf”?
Console.WriteLine("5.feladat");
StreamWriter sw = new StreamWriter("keres.txt");
sw.WriteLine("gaoaf");
string s = "";
for (int i = 0; i < n; i++)
{
s = zadatok[i].nev+zadatok[i].cim;
if (s.Contains("g") && s.Contains("a") && s.Contains("o") && s.Contains("a") && s.Contains("f") )
{
sw.WriteLine(i);
sw.WriteLine(zadatok[i].nev + zadatok[i].cim);
}
}
sw.Close();
為什么不這樣呢?
static bool CheckInOrder(string source, string charsToCheck)
{
int index = -1;
foreach (var c in charsToCheck)
{
index = source.IndexOf(c, index + 1);
if (index == -1)
return false;
}
return true;
}
然后,您可以使用如下功能:
bool result = CheckInOrder("this is my source string", "gaoaf");
這應該起作用,因為如果找不到字符串, IndexOf
返回-1
,並且它僅在上一個匹配項之后開始掃描。
您可以將字母轉換為模式並使用Regex
:
var letters = "gaoaf";
var pattern = String.Join(".*",letters.AsEnumerable());
var hasletters = Regex.IsMatch(s, pattern, RegexOptions.IgnoreCase);
對於那些不必要地避免使用.*
,還可以使用LINQ解決此問題:
var ans = letters.Aggregate(0, (p, c) => p >= 0 ? s.IndexOf(c.ToString(), p, StringComparison.InvariantCultureIgnoreCase) : p) != -1;
如果可能有重復的相鄰字母,則需要使LINQ解決方案稍微復雜一些:
var ans = letters.Aggregate(0, (p, c) => {
if (p >= 0) {
var newp = s.IndexOf(c.ToString(), p, StringComparison.InvariantCultureIgnoreCase);
return newp >= 0 ? newp+1 : newp;
}
else
return p;
}) != -1;
鑒於基本要盡早終止Aggregate
所需的(丑陋)機密,以及使用內聯匿名表達式調用來擺脫臨時newp
所需的(丑陋且低效)語法,我創建了一些擴展以提供幫助,可以終止的Aggregate
早:
public static TAccum AggregateWhile<TAccum, T>(this IEnumerable<T> src, TAccum seed, Func<TAccum, T, TAccum> accumFn, Predicate<TAccum> whileFn) {
using (var e = src.GetEnumerator()) {
if (!e.MoveNext())
throw new Exception("At least one element required by AggregateWhile");
var ans = accumFn(seed, e.Current);
while (whileFn(ans) && e.MoveNext())
ans = accumFn(ans, e.Current);
return ans;
}
}
現在,您可以輕松地解決問題:
var ans2 = letters.AggregateWhile(-1,
(p, c) => s.IndexOf(c.ToString(), p+1, StringComparison.InvariantCultureIgnoreCase),
p => p >= 0
) != -1;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.