LINQ 更改 dict 中的 KeyValuePair

Posted

技术标签:

【中文标题】LINQ 更改 dict 中的 KeyValuePair【英文标题】:LINQ to change KeyValuePair in dict 【发布时间】:2020-01-28 17:57:38 【问题描述】:

我正在尝试使用正则表达式解析化学式的输入文本。正则表达式应该能够处理多个相同元素,即 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);

错误:输入字符串的格式不正确。或“字典中已存在键”。

【问题讨论】:

您需要确保您的密钥中没有重复项。一个键是唯一的,它不能多次存在 您可以在 ToDictionary 之前执行 GroupBy 以对键进行分组并聚合值。 【参考方案1】:
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();

【讨论】:

以上是关于LINQ 更改 dict 中的 KeyValuePair的主要内容,如果未能解决你的问题,请参考以下文章

LINQ 中的升序/降序 - 可以通过参数更改顺序吗?

为啥从 Python 中的对象继承,在不指定父对象时更改 __dict__ 的类型不会? [复制]

LINQ 中的数据冲突

使用 LINQ 获取两个比较列表的结果并根据结果更改列表中的属性

映射 dict(来自 rdd)以递归方式更改 Python/PySpark 中的列名

函数中的LINQ查询,该函数使用param来更改结果集