LINQ, чтобы изменить KeyValuePair в dict - PullRequest
0 голосов
/ 29 сентября 2019

Я пытаюсь использовать Regex для анализа входного текста химической формулы.Regex должен быть в состоянии обрабатывать несколько одинаковых элементов, то есть CH4 или CHHHH.

Для других своих словарей я использовал if (Dict.ContainsKey (H) Dict [H] .Value ++;

        int count = 0;

        string chemForm = tbxFormula.Text.ToString();

        string pat = @"(?<Key>[A-Z]|([A-Z][a-z]))(?<Value>[0-9]|() )";


        KVPs = (from Match m in Regex.Matches(chemForm, pat)
                select new
                {
                    key = m.Groups["Key"].Value,
                    value = int.Parse(m.Groups["Value"].Value) ,

                }).ToDictionary(p => p.key, p => p.value);

Ошибка: строка ввода не была правильно отформатирована. Или"ключ уже существует в словаре".

1 Ответ

0 голосов
/ 29 сентября 2019
try this:

 //string chemForm = "HHO"; // H2 O1
 string chemForm = "CH4N10"; // C1 H4 N10
 var distinctElements = new HashSet<char>();
 var KVPs = new Dictionary<char, int>();

chemForm
.ToUpper()
.ToCharArray()
.Where(c => Regex.Match(c.ToString(), @"[A-Z]").Success)
.ToList()
.ForEach(c => distinctElements.Add(c));

foreach (char c in distinctElements)
{
   Match m = Regex.Match(chemForm,
   $@"(?<element>[{c}]+(?=\D|\b))|(?<quantifiedElement>[{c}][0-9]+)");
    if (!string.IsNullOrEmpty(m.Groups["element"].Value)) KVPs.Add(c, 
   m.Groups["element"].Value.Length);
    if (!string.IsNullOrEmpty(m.Groups["quantifiedElement"].Value)) KVPs.Add(c, 
  int.Parse(m.Groups["quantifiedElement"].Value.Substring(1)));
}

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