У меня есть ситуация, когда у меня есть словарь типа Dictionary<string, List<int>>
. Я хотел бы применить жало. Присоединяйтесь к нему, я хотел бы, чтобы данные отображались следующим образом:
"abc1:1,2,3,4,abc2:1,3,8,abc3:3,1,7"
то, что я пробовал, это:
$"{string.Join(", ", iformation.OrderBy(x => x.Key).Select(x => x.Key + ": " + string.Join(",", x.Value.ToArray())))}";
Результат был:
System.Collections.Generic.Dictionary`2+KeyCollection[System.String,System.Collections.Generic.List`1[System.Int32]]:
может ли кто-нибудь помочь мне с тем, чего я хочу достичь?
Я запустил ваш код, и он не дает того результата, который, как вы утверждаете, дает. Это не совсем то, что вам нужно (нет [
или ]
и лишних пробелов), но это не за горами.
нет, они всегда будут содержать целые числа
Голосование за закрытие, поскольку воспроизвести проблему, с которой вы столкнулись, невозможно. ‼Пример.
Ваш string.Join
работает нормально. Где ваш код для настройки iformation
и как вы распечатываете результат?
Никакого воспроизведения, даже в .NET 5. Также нет необходимости в интерполяции строк, String.Join
уже возвращает строку. ToArray()
тоже не нужен. Код избыточен, но работает. Срок службы .NET 5 истек в мае 2022 года, более 2 лет назад. Даже .NET 6, самая старая версия LTS, достигла EOL в ноябре 2024 года.
Единственный способ получить System.Collections.Generic.Dictionary...
— вызвать iFormation.ToString
или использовать $"{iformation}"
. Я подозреваю, что реальный код настолько сложен, что в конечном итоге сериализуется не то, что нужно.
Вывод, подобный вашему, происходит, когда вы вызываете метод ToString
для коллекций (словарь в вашем случае). Ниже вы можете найти правильный код и сравнить его:
var dict = new Dictionary<string, List<int>>()
{
["abc1"] = [1,2,3,4],
["abc3"] = [3,1,7],
["abc2"] = [1,3,8],
};
var result = string.Join(
", ",
dict
.OrderBy(x => x.Key)
.Select(x => $"{x.Key}:{string.Join(",", x.Value)}"));
Здесь вы можете найти рабочий пример .
Краткая версия:
var s = string.Join(',',
from row in data
orderby row.Key
select row.Key + ":" + string.Join(',', row.Value));
Console.WriteLine(s);
Однако все варианты Join
/Concat
здесь были бы «красивыми», но неэффективными, поскольку создавали бы несколько промежуточных значений — в частности, для каждого ключа дополнительно:
"1,2,3,4"
"abc1:1,2,3,4"
которые потом нужно собрать.
ИМО, просто сделайте это вручную:
Dictionary<string, List<int>> data = new()
{
["abc1"] = [1, 2, 3, 4],
["abc2"] = [1, 3, 8],
["abc3"] = [3, 1, 7],
};
// TODO: possible check for `data.Count == 0`, i.e. `return "";`
var sb = new StringBuilder();
bool firstKey = true;
foreach (var (key, list) in data) // possible OrderBy(x => x.Key) here
{
if (firstKey)
{
firstKey = false;
}
else
{
sb.Append(',');
}
sb.Append(key).Append(':');
bool firstVal = true;
foreach (var val in list)
{
if (firstVal)
{
firstVal = false;
}
else
{
sb.Append(',');
}
sb.Append(val);
}
}
var s = sb.ToString();
Console.WriteLine(s);
Также обратите внимание, что словари по своей природе неупорядочены, поэтому ключи могут отображаться не в том порядке, в котором вы ожидаете; однако значения внутри каждого ключа останутся упорядоченными.
Ожидаемый результат вашего примера выглядит как JSON. Почему бы вместо этого не использовать сериализатор JSON? Использование
String.Join
означает, что вам нужно быть осторожным и не создавать недействительный JSON. (например, что произойдет, если какое-либо из значений вашего словаря.Key
содержит кавычки или пробелы?)