Заменить определенную подстроку в определенной позиции, используя LINQ - PullRequest
0 голосов
/ 30 мая 2018

У меня есть список аббревиатур и позиций, которые я хочу заменить конкретной конкретной аббревиатурой, а не все аббревиатуры.

public class Abbreviation
{
    public int Pos { get; set; }
    public string ShortName { get; set; }
    public string LongName { get; set; }
}
class Program
{
    static void Main(string[] args)
    {
        List<Abbreviation> abbreviations = new List<Abbreviation>();
        abbreviations.Add(new Abbreviation() { Pos = 28, ShortName = "exp.", LongName = "expression" });
        abbreviations.Add(new Abbreviation() { Pos = 38, ShortName = "para.", LongName = "paragraph" });
        abbreviations.Add(new Abbreviation() { Pos = 51, ShortName = "ans.", LongName = "answer" });

        string test = "What is exp.? This is a test exp. in a para. contains ans. for a question";
        abbreviations.ForEach(x => ...); // Need a LINQ expression
        Console.WriteLine(test);
    }
}

Как это сделать в LINQ?

Ответы [ 2 ]

0 голосов
/ 30 мая 2018

Помните, что если вы замените аббревиатуру непосредственно у источника, индекс позиции следующей аббревиатуры, которую вы замените, будет отличаться от того, который вы объявили в начале.Так что, как я вижу, вам понадобятся некоторые вспомогательные переменные.

Кроме того, ваши начальные индексы были немного не в порядке.

РЕДАКТИРОВАТЬ - ЗаменилиLINQ ForEach обычным foreach, чтобы у вас не было конфликтов при использовании методов, которые он не поддерживает, например String.IsNullOrEmpty()

public class Abbreviation
{
    public int Pos { get; set; }
    public string ShortName { get; set; }
    public string LongName { get; set; }
}
class Program
{
    static void Main(string[] args)
    {
        List<Abbreviation> abbreviations = new List<Abbreviation>();
        abbreviations.Add(new Abbreviation() { Pos = 29, ShortName = "exp.", LongName = "expression" });
        abbreviations.Add(new Abbreviation() { Pos = 39, ShortName = "para.", LongName = "paragraph" });
        abbreviations.Add(new Abbreviation() { Pos = 54, ShortName = "ans.", LongName = "answer" });

        string test = "What is exp.? This is a test exp. in a para. contains ans. for a question";

        string temp = "";
        int tempPos = 0;

        foreach (Abbreviation x in abbreviations)
        {
            if (!String.IsNullOrEmpty(test) && (test.Length >= x.Pos + x.ShortName.Length) && test.Substring(x.Pos, x.ShortName.Length) == x.ShortName)
            {
                temp += test.Substring(tempPos, x.Pos) + x.LongName;
            }
            tempPos = x.Pos + x.ShortName.Length;
        }
        Console.WriteLine(temp);
    }
}
0 голосов
/ 30 мая 2018

Хорошо, как насчет этого:

  public static void Main()
    {
        //var search = new Regex(@"spell\ correction", RegexOptions.IgnoreCase);
        //var data = "this is a teit that i see that";

        List<Abbreviation> abbreviations = new List<Abbreviation>();
        abbreviations.Add(new Abbreviation() { Pos = 29, ShortName = "exp.", LongName = "expression" });
        abbreviations.Add(new Abbreviation() { Pos = 39, ShortName = "para.", LongName = "paragraph" });
        abbreviations.Add(new Abbreviation() { Pos = 54, ShortName = "ans.", LongName = "answer" });

        string test = "What is exp.? This is a test exp. in a para. contains ans. for a question";
        var offset = 0;
        abbreviations.ForEach(x => {

            if(test.Substring(x.Pos+ offset, x.ShortName.Length)==x.ShortName)
            {

                test = test.Remove(x.Pos + offset, x.ShortName.Length);
                test= test.Insert(x.Pos  + offset, x.LongName);
                offset += x.LongName.Length - x.ShortName.Length ;
            }

        }); // Need a LINQ expression
        Console.WriteLine(test);
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...