解决 使用一个字符串或另一个

巴扎

新成员
已加入
2020年11月19日
留言内容
3
编程经验
Beginner
嗨,大家好,

我有翻译文本文件的代码,以便可以将其读取到其他软件中。但是,我正在翻译的供应商文件已更改了最新版本(AD20)中的两个字符串。在以前的版本(AD19)中,他们使用了字符串“顶部覆盖”和“底部覆盖”。在新版本(AD20)中,它们使用T.SilkS和B.SilkS表示同一件事。

我应该如何更改下面的代码,以便在AD19和AD20版本中都能读取?

C#:
private string LayerContent
{
    get
    {
        int indexStart = _line.IndexOf("NAME=Top Overlay"); //This works for AD19
        int indexEnd = _line.IndexOf("NAME=Bottom Overlay");   //This works for AD19
        //int indexStart = _line.IndexOf("NAME=T.SilkS");    //This works for AD20
        //int indexEnd = _line.IndexOf("NAME=B.SilkS");    //This works for AD20

        string context = _line.Substring(indexStart, indexEnd - indexStart);
        return context;
    }
}

谢谢你的帮助。
巴扎
 
由主持人最后编辑:
Solution
C#:
int indexStart = _line.IndexOf("NAME=Top Overlay");

if (index.Start == -1)
{
    indexStart = _line.IndexOf("NAME=T.SilkS");
}
Not that the String class has an IndexOfAny method but that only works for char values, not substrings. You could write your own extension method that worked for substrings, e.g.
C#:
public static class StringExtensions
{
    public static int IndexOfAny(this string source, params string[] anyOf)
    {
        var index = -1;

        foreach (var substring in anyOf)
        {
            index = source.IndexOf(substring);

            if (index != -1)
            {
                break;
            }
        }

        return index...

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,522
地点
悉尼,澳大利亚
编程经验
10+
C#:
int indexStart = _line.IndexOf("NAME=Top Overlay");

if (index.Start == -1)
{
    indexStart = _line.IndexOf("NAME=T.SilkS");
}
Not that the String class has an IndexOfAny method but that only works for char values, not substrings. You could write your own extension method that worked for substrings, e.g.
C#:
public static class StringExtensions
{
    public static int IndexOfAny(this string source, params string[] anyOf)
    {
        var index = -1;

        foreach (var substring in anyOf)
        {
            index = source.IndexOf(substring);

            if (index != -1)
            {
                break;
            }
        }

        return index;
    }
}
在您的项目中包含该类,然后可以执行以下操作:
C#:
int indexStart = _line.IndexOfAny("NAME=Top Overlay", "NAME=T.SilkS");
无论哪种情况,都应将最有可能被发现的内容放在首位,因此避免尽可能多地查找。如果不是的话,这不是世界末日,但它会更可取。
 
解决方案

巴扎

新成员
已加入
2020年11月19日
留言内容
3
编程经验
Beginner
谢谢您的意见。

我尝试了您的第一个建议,但不得不将index.Start更改为indexStart,将index.End更改为indexEnd。但是,我现在得到了错误-无法在此范围内声明名为'indexEnd'的局部变量,因为它将给'indexEnd'赋予不同的含义,该变量已在'父或当前'范围中用于表示其他内容
干杯,巴扎
 

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,522
地点
悉尼,澳大利亚
编程经验
10+
对不起,流氓点,但是,剩下的就在你身上。如果您当前正在使用此代码:
Old Code:
private string LayerContent
{
    get
    {
        int indexStart = _line.IndexOf("NAME=Top Overlay");
        int indexEnd = _line.IndexOf("NAME=Bottom Overlay");

        string context = _line.Substring(indexStart, indexEnd - indexStart);
        return context;
    }
}
那么我的建议将在正确执行的情况下起作用:
New Code:
private string LayerContent
{
    get
    {
        int indexStart = _line.IndexOf("NAME=Top Overlay");

        if (indexStart == -1)
        {
            indexStart = _line.IndexOf("NAME=T.SilkS");
        }

        int indexEnd = _line.IndexOf("NAME=Bottom Overlay");

        if (indexEnd == -1)
        {
            indexEnd = _line.IndexOf("NAME=B.SilkS");
        }

        string context = _line.Substring(indexStart, indexEnd - indexStart);
        return context;
    }
}
 
最佳 底部