Обычно вы не хотите манипулировать данными в строковой форме, если только данные не являются строкой. В этом случае у вас действительно есть структура, которая представляется в виде строки, поэтому сначала вы должны превратить ее в структуру.
Основанный на строках, которые вы предоставили, это превращает любую строку подобной формы в словарь.
var source = "l=50; r=190; t=-505; b=-555";
var components = source.Split(';').Select(x => x.Trim());
// components is now an enumerable of strings "l=50", "r=190" etc.
var pairs = components.Select(x => x.Split('=').ToArray());
// pairs is now an enumerable of arrays of strings ["l", "50"], ["r", "190"] etc;
var dictionary = pairs.ToDictionary(x => x[0], x => x[1]);
// dictionary now contains r => 190, l => 50 etc.
Конечно, вы хотите играть с реальными цифрами, так что вы хотите, чтобы преобразовать значения в целых действительно, так подкачки, что последняя строка из:
var dictionary = pairs.ToDictionary(x => x[0], x => Convert.ToInt32(x[1]));
Теперь у вас есть словарь, который вам могут манипулировать:
dictionary["t"] = dictionary["t"] - 75;
Например. Или вы можете использовать это как основу для заполнения объекта соответствующими свойствами и манипулирования ими.
struct Position {
public int L { get; set; }
public int R { get; set; }
public int T { get; set; }
public int B { get; set; }
}
Конечно, вы можете изменить его обратно в строку, когда вы закончите манипулировать им:
var newString = string.Join("; ", dictionary.Select(x => $"{x.Key}={x.Value}"));
Хотя, если вы планируете работать с ним много, вы должны держать разобранный версии вокруг как можно дольше, так как цикл синтаксического анализа/рендеринга может быть проблемой производительности, если вы его много делаете.
Всегда храните ваши данные в соответствующих типах. Напишите новые классы, напишите новые структуры, они не должны быть сложными, но чем больше вы можете дать имена и формы вашим данным, тем легче манипулировать ими и обеспечить правильное управление им.
Это все очень упрощенно, конечно - нет обработки ошибок, например, если значение часть не является допустимым Int32 (Convert.ToInt32
будет сгенерировано исключение), или если есть повторяющиеся ключи (ToDictionary
сгенерирует исключение) и т.д. Но, надеюсь, это дает вам представление о том, куда идти.
Это также не единственный способ разобрать этот тип строки, но это довольно просто, и не должно быть слишком медленным, хотя на большой входной строке это не будет очень эффективно с точки зрения памяти.
Вы должны разобрать строку в объект, изменить значения и переформатировать строку. –
Можете ли вы изменить источник строки? – BWA
О, c'mon люди. Вопрос не так уж плох для новичков . Не заслуживает всех downvotes! – trailmax