@Loudin

Как создать строку из массива с разделителем?

У меня есть массив:

string[] sentence = new string[] { "Привет", "меня", "зовут", "*", "Мой", "возраст", "таков" };


Мне нужно, чтобы в итоге было 2 переменных:
var name = "Привет меня зовут"
var age = "Мой возраст таков"


Символ * служит как разделитель одной части, от другой.

Не всегда символ * находится на 4 месте в массиве. Он может быть в любом месте.

Нужно сделать подобное, но с массивом строк на C#.
Как это сделать?
  • Вопрос задан
  • 1132 просмотра
Пригласить эксперта
Ответы на вопрос 3
vabka
@vabka Куратор тега C#
Токсичный шарпист
1. Держи екстеншен, который я только что написал (протестировал его, чтобы вёл себя почти как string.Split)
Код, конечно, не идеален, но работает
public static class ArrayExtensions
{
    public static List<List<T>> Split<T>(this IEnumerable<T> array, T separator, IEqualityComparer<T>? equalityComparer = null)
    {
        equalityComparer ??= EqualityComparer<T>.Default;
        var parts = new List<List<T>>();
        var currentPart = new List<T>();
        foreach (var element in array)
        {
            var isSeparator = equalityComparer.Equals(element, separator);
            if (isSeparator)
            {
                parts.Add(currentPart);
                currentPart = new List<T>();
            }
            else
            {
                currentPart.Add(element);
            }
        }
        parts.Add(currentPart);
        return parts;
    }
}


2. Тогда с ним можно будет сделать так:
var array = new [] { "Привет", "меня", "зовут", "*", "Мой", "возраст", "таков" };
var parts = array.Split("*").Select(x => string.Join(' ', x)).ToArray();
var name = parts[0];
var age = parts[1];
Ответ написан
@oleg_ods
Метод IndexOf массива -> узнать индекс разделителя.
Метод string.Join() -> склеить массив строк в одну строку через разделитель.
Ответ написан
Комментировать
edward_freedom
@edward_freedom
var words = new[] { "Привет", "меня", "зовут", "*", "Мой", "возраст", "таков" };
            var variables = new Dictionary<string, string>()
            {
                {"name", string.Empty},
                {"age", string.Empty}
            };
            
            var items = words.Select((word, index) => new
            {
                Item = word,
                Index = index,
                Group = words.Skip(index)
                    .Select((wordFind, indexFind) => new
                    {
                        Item = wordFind,
                        Index = indexFind + index
                    })
                    .FirstOrDefault(wordFilter => wordFilter.Item.Equals("*"))
            }).GroupBy(wordGroup => wordGroup.Group?.Index);

            foreach (var item in items)
            {
                var groupped = string.Join(" ",
                    item.Select(word => word.Item)
                        .Where(word => !word.Equals("*")));

                var key = variables.Where(keyVariable => keyVariable.Value.Equals(string.Empty))
                    .Select(keyVariable => keyVariable.Key).FirstOrDefault();

                if (key != null && variables.ContainsKey(key))
                {
                    variables[key] = groupped;
                }
            }
            
            Debug.WriteLine(
                string.Join("\n", variables.Select(wordsObject =>
                $"key: {wordsObject.Key}, value: {wordsObject.Value}")));
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы