C #: добавление данных в словарь - PullRequest
2 голосов
/ 05 августа 2010

У меня есть список как

List<string> TempList = new List<string> { "[66,X,X]", "[67,X,2]", "[x,x,x]" };

Мне нужно добавить данные в словарь из приведенного выше списка

Dictionary<int, int> Dict = new Dictionary<int, int>();

так что Dict должен содержать

Key --> 66 value --> 67

Мне нужно взять 66 (первое значение) из первой строки ([66, X, X]) и 67 (первое значение) из второй строки ([67, X, X]) и добавить его как пару значений ключа в словарь.

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

Есть ли способ сделать это в LINQ или регулярном выражении.

Ответы [ 5 ]

2 голосов
/ 05 августа 2010

После вашего комментария о том, что вы начинаете со списка списков, я понял, что вы после этого. Я снова использую функцию Ярослава 'GetNumber' здесь. Написал мой пример с массивом массивов строк, но должен работать точно так же. Приведенный ниже код будет выдан, если у вас есть дубликаты ключей, что, как я полагаю, вам нужно, если вы используете словарь.

        var input = new []
                        {
                            new [] { "[66,X,X]", "[67,X,2]", "[x,x,x]" },
                            new [] { "[5,X,X]", "[8,X,2]", "[x,x,x]" }
                        };

        var query = from l in input
                    select new 
                    {
                     Key = GetNumber(l.ElementAt(0)), 
                     Value = GetNumber(l.ElementAt(1))
                     };

        var dictionary = query.ToDictionary(x => x.Key, x => x.Value);
1 голос
/ 05 августа 2010

Вот пример использования string.Split() и регулярного выражения:

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            List<string> data = new List<string>() { "[66,X,X]", "[67,X,2]", "[x,x,x]" };
            addToDict(data);

            Console.ReadKey();
        }

        private static void addToDict(List<string> items)
        {
            string key = items[0].Split('[', ',')[1];
            string val = items[1].Split('[', ',')[1];

            string pattern = @"(?:^\[)(\d+)";
            Match m = Regex.Match(items[0], pattern);
            key = m.Groups[1].Value;
            m = Regex.Match(items[1], pattern);
            val = m.Groups[1].Value;

            _dict.Add(key, val);
        }

        static Dictionary<string, string> _dict = new Dictionary<string, string>();
    }
}

Я подозреваю, что ваш пример довольно надуманный, поэтому может быть лучшее решение, особенно если вам нужно обработать большое количество строк в пары ключ / значение (я намеренно жестко закодировал значения индекса, потому что ваш пример был довольно прост, и я не не усложняю ответ). Если входные данные согласованы по формату, вы можете делать предположения, например, использовать фиксированные индексы, но если есть вероятность некоторой дисперсии, тогда может потребоваться больше кода для проверки его достоверности.

1 голос
/ 05 августа 2010

Вы можете использовать регулярное выражение для извлечения значения из каждого элемента в списке, и, если хотите, используйте LINQ, чтобы выбрать два списка и сжать их вместе (в C # 4.0):

var regex      = new Regex(@"\d+");
var allValues  = TempList.Select(x =>int.Parse(regex.Match(x).Value));
var dictKeys   = allValues.Where((x,index)=> index % 2 == 0); //even-numbered 
var dictValues = allValues.Where((x,index)=> index % 2 > 0); //odd numbered 
var dict       = dictKeys.Zip(dictValues, (key,value) => new{key,value})
                         .ToDictionary(x=>x.key,x=>x.value);

Если вы используете C # 3.5, вы можете использовать реализацию Эрика Липперта Zip () .

0 голосов
/ 05 августа 2010
List<List<string>> source = GetSource();

Dictionary<int, int> result = source.ToDictionary(
  tempList => GetNumber(tempList[0]),
  tempList => GetNumber(tempList[1])
);
0 голосов
/ 05 августа 2010

ЕСЛИ я правильно понимаю: вы хотите создать связанные узлы, такие как 66 -> 67, 67 -> 68, ... n -> n+1?

Я бы не использовал LINQ:

private static int GetNumber(string s)
{
    int endPos = s.IndexOf(',');
    return Int32.Parse(s.Substring(1, endPos-1));
}

И в коде:

int first, second;    
for (int i = 1; i < TempList.Count; i++)
{
    first = GetNumber(TempList[i - 1]);
    second = GetNumber(TempList[i]);

    Dict.Add(first, second);
}

Вы также должны выполнить проверку и т. Д.
В примере предполагается наличие списка как минимум из 2 элементов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...