gacar Ответов: 3

Как мне, словарь(целого числа, список(целого числа)) построить с помощью linq и string.метод соединения?


У меня есть словарь
Dim DicInt As New Dictionary(Of Integer, List(Of Integer))
DicInt.Add(5, {4, 5, 3}.ToList)
DicInt.Add(6, {8, 1}.ToList)

Как я могу получить такую строку
5 > 4,5,3
6 > 8,1  

Спасибо.

Что я уже пробовал:

Dim strSutun2 As String = String.Join(vbNewLine, String.Join(" > ", DicInt.Select(Function(list) String.Join(",", list))))

Gerry Schmitz

Цикл foreach на ключе словаря был бы проще (для понимания).

LINQ не будет "быстрее".

gacar

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

phil.o

Каков результат предоставленного Вами фрагмента кода?

gacar

У меня было вот что: [5, система.Коллекции.Generic.List`1[System.Int32]] > [6, System.Коллекции.Универсальный.Список`1[Система.Типа int32]]

phil.o

Почему бы не попытаться создать метод расширения для a Dictionary(of T, List(of U)) во-первых? Затем, если вы действительно хотите использовать Linq для этого, вы можете попробовать перевести его.

gacar

Как я могу это сделать, я не знаю. Я не очень хорошо программирую, я любитель.

phil.o

Ну, честно говоря, я остановился VB.NET когда дженериков еще не существовало. Я мог бы записать это на C# за считанные минуты.
Я постараюсь придумать что-нибудь полезное (но сначала мне нужно поесть; задержка около 1 часа).

gacar

Спасибо. Я могу преобразовать c# в vb.net

3 Ответов

Рейтинг:
28

phil.o

Вот вам и версия для C#.

using System.Collections.Generic;
using System.Text;

// You need a static class for extension methods.
public static class DictionaryExtensions
{
   public static string Dump<T, U>(this IDictionary<T, IList<U>> dictionary)
   {
      StringBuilder builder = new StringBuilder();
      string newline = Environment.NewLine;
      int length = newline.Length;
      foreach (var pair in dictionary)
      {
         builder.AppendFormat
         (
            "{0} > {1}",
            pair.Key,
            string.Join(",", pair.Value)
         );
         builder.Append(Environment.NewLine);
      }
      builder.Remove(builder.Length - length, length); // Remove last line feed
      return builder.ToString();
   }
}

Использование:
Dim strSutun2 As String = DicInt.Dump()

Надеюсь, это поможет.


gacar

Спасибо Вам за ваше решение.

gacar

Я преобразовал код. Но я не могла позвонить. Как я могу позвонить в vb?

Система Импорта.Коллекции.Общий
Система Импорта.Текст
Система Импорта.Во время выполнения.CompilerServices
Модуль Словарные Расширения
<расширение()>
Функция сброса(Т, Ц)(бывал как IDictionary словарь(т, то IList(п))) в виде строк
Дим Builder как то StringBuilder новое окно инструментов()
Dim newline As String = Environment.NewLine
Тусклая длина в виде целого числа = новая строка.Длина

Для каждой пары в словаре
строитель.AppendFormat("{0} > {1}", пара.ключевая строка.Присоединиться(",", пара.Значение))
строитель.Добавить(Environment.NewLine)
Следующий

строитель.Удалить(построитель.Length - длина, длина)
Возвращение строителя.Метод toString()
Конечная Функция
Конечный Модуль

gacar

Частная суб обработчика button1_click(отправителя как объект, а равно EventArgs) обрабатывает кнопки button1.Щелчок
Дим DicInt Как Новый Словарь(Целочисленных, Список(Целых))
DicInt.Добавить(5, {4, 5, 3}.Толист)
DicInt.Add(6, {8, 1}.ToList)

Dim strSutun2x As String = DicInt.Dump() 'здесь произошла ошибка
Конец Подводной Лодки

phil.o

А вы пробовали Imports DictionaryExtensions в начале кода вашей формы?

gacar

Я импортировал но у меня все еще есть эта ошибка :
"Ошибка BC30456 'свалка' не является членом 'словарь(целочисленных, список(целочисленного))'.

phil.o

Это говорит о том, что вы не импортировали должным образом. Может быть, проблема с пространством имен? Я не могу сделать ничего лучше, чем догадаться, что я боюсь...

Рейтинг:
19

Maciej Los

Попробовать это:

Dim DicInt As New Dictionary(Of Integer, List(Of Integer))
DicInt.Add(5, New List(Of Integer) From {4, 5, 3})
DicInt.Add(6, New List(Of Integer) From {8, 1})


Dim result = DicInt _
    .Select(Function(kvp) _
        String.Concat(kvp.Key, " => ", _
            String.Join(", ", kvp.Value.Select(Function(x) x)))) _
    .ToList()
For Each s As String In result
	Console.WriteLine(s)
Next


gacar

Спасибо за решение.

Maciej Los

Всегда пожалуйста.

Maciej Los

Можете ли вы принять этот ответ как решение? Это нужно сделать, чтобы удалить ваш вопрос из списка без ответа. Используйте зеленую кнопку.

Рейтинг:
10

gacar

Я нашел это решение.

Dim str As String = String.Join(vbNewLine, DicInt.Select(Function(x) x.Key & " > " & String.Join(",", x.Value)))

Результат:
5 > 4,5,3
6 > 8,1