检查字符串是否包含C#r中特定顺序的字符

检查字符串是否包含C#r中特定顺序的字符,c#,string,file,character,C#,String,File,Character,我有一个代码正在运行,但它不检查字符是否有序,它只检查字符是否在那里。如何修改代码,以便在字符串中按该顺序检查字符“gaoaf” Console.WriteLine("5.feladat"); StreamWriter sw = new StreamWriter("keres.txt"); sw.WriteLine("gaoaf"); string s = ""; for (int i = 0; i

我有一个代码正在运行,但它不检查字符是否有序,它只检查字符是否在那里。如何修改代码,以便在字符串中按该顺序检查字符“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();
Console.WriteLine(“5.feladat”);
StreamWriter sw=新的StreamWriter(“keres.txt”);
西南书写线(“gaoaf”);
字符串s=“”;
对于(int i=0;i
为什么不做这样的事情

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

为什么不使用
s.Contains(“gaoaf”)
?如果要查找
gaoaf
,可以将其传递给string.Contains()方法。或者你想找到“ngpwarosatgf”吗?我正在搜索按此顺序包含这些字母的歌曲。如果整首歌都是例如:Omega:Ortaf,那么键入s.Contains(“gaoaf”)是否有效?不,这就是我问的原因。这可能是正则表达式的一项工作,或者只有在找到前一个字母后,您才会查看子字符串并搜索下一个字母,这在编码处理不同的字符串时会变得很棘手。您还可以指定这是一个特定的字符串,还是要比较的字符串是可变的?换句话说,这是一直在寻找“gaoaf”还是你以后需要搜索另一组角色?我有点希望让op根据指示完成他们的任务,但这正是我想要的。非常感谢@如果这是家庭作业,我建议你确保你完全理解这段代码在做什么,或者想出你自己的方法。
var ans2 = letters.AggregateWhile(-1,
                                  (p, c) => s.IndexOf(c.ToString(), p+1, StringComparison.InvariantCultureIgnoreCase),
                                  p => p >= 0
                                 ) != -1;