如何在添加到字典之前检查键是否存在
how to check if key exists before adding in to dictionary
我正在使用以下 linq 代码向字典中添加值,现在发生的是重复的键输入,它跳过了字典中的两个条目,我需要至少一个出现在字典中。如何在以下 LINQ 代码中执行此操作。我只想要在 LINQ 中使用,代码如下所示:
dict = (from x in sites
let pp1 = x.Split(',')
where pp1.Length > 2
let rnc = pp1[1].Replace("work=", "")
let ems = pp1[2].Replace("Context=", "")
let pp2 = GetName(ems, "CC", "U").Split('_')
where pp2.Length > 1 && !ems.Contains("_L_")
select new
{
name_ms = ems,
Key = ems + "," + rnc,
Value = Getidname(GetName(ems, "CC", "U"),
GetCode(pp2[1])) + "," + ems.Split('_')[1]
})
.ToDictionary(x => x.Key, x => x.Value);
您需要按 Key
属性 分组,然后 Select
First
从分组的子项目中分组。那么你将有效地跳过不是第一个按Key分组的记录。
...).GroupBy(i => i.Key).Select(g => g.First()).ToDictionary(...
坦率地说,我会编写一个自定义扩展方法来替换 ToDictionary
,但不是使用 Add
,而是使用索引器赋值:
public static Dictionary<TKey, TValue> ToDictionaryLast<TSource, TKey, TValue>(
this IEnumerable<TSource> source, Func<TSource, TKey> keySelector,
Func<TSource, TValue> valueSelector)
{
var result = new Dictionary<TKey, TValue>();
foreach(var value in source)
result[keySelector(value)] = valueSelector(value);
return result;
}
哪个 - 在重复键的情况下 - 保留最后一个值,而不是失败。然后将最后一个操作替换为:
.ToDictionaryLast(x => x.Key, x => x.Value);
我正在使用以下 linq 代码向字典中添加值,现在发生的是重复的键输入,它跳过了字典中的两个条目,我需要至少一个出现在字典中。如何在以下 LINQ 代码中执行此操作。我只想要在 LINQ 中使用,代码如下所示:
dict = (from x in sites
let pp1 = x.Split(',')
where pp1.Length > 2
let rnc = pp1[1].Replace("work=", "")
let ems = pp1[2].Replace("Context=", "")
let pp2 = GetName(ems, "CC", "U").Split('_')
where pp2.Length > 1 && !ems.Contains("_L_")
select new
{
name_ms = ems,
Key = ems + "," + rnc,
Value = Getidname(GetName(ems, "CC", "U"),
GetCode(pp2[1])) + "," + ems.Split('_')[1]
})
.ToDictionary(x => x.Key, x => x.Value);
您需要按 Key
属性 分组,然后 Select
First
从分组的子项目中分组。那么你将有效地跳过不是第一个按Key分组的记录。
...).GroupBy(i => i.Key).Select(g => g.First()).ToDictionary(...
坦率地说,我会编写一个自定义扩展方法来替换 ToDictionary
,但不是使用 Add
,而是使用索引器赋值:
public static Dictionary<TKey, TValue> ToDictionaryLast<TSource, TKey, TValue>(
this IEnumerable<TSource> source, Func<TSource, TKey> keySelector,
Func<TSource, TValue> valueSelector)
{
var result = new Dictionary<TKey, TValue>();
foreach(var value in source)
result[keySelector(value)] = valueSelector(value);
return result;
}
哪个 - 在重复键的情况下 - 保留最后一个值,而不是失败。然后将最后一个操作替换为:
.ToDictionaryLast(x => x.Key, x => x.Value);