所以我列表中的字典项集合:
List<Dictionary<string, string>> inputData = new List<Dictionary<string, string>>(inputs);
List<Dictionary<string, string>> itemStack = new List<Dictionary<string, string>>();
现在我要做的是每个inputData字典项我想检查itemStack是否具有相同的值(字典项)。
我在想它会是什么样的?
foreach (var item in inputData)
{
if(!itemStack.Contains(item){ itemStack.Add(item)}
else{ //Duplicate found}
}
它没有真正检查里面的项目值?它只是假设它没有它...... 我想要的只是如果itemStack包含,并且堆栈中已有的项目不包含它。 我知道我错过了一些明显的东西。 谢谢,
答案 0 :(得分:1)
Dictionary是引用类型,因此它不会像您预期的那样检查“深度”值。
您必须编写自己的“包含”方法,作为完全独立的方法或字典本身的扩展,然后使用它,例如:
if(!MyContains(itemStack, item)){ itemStack.Add(item)}
答案 1 :(得分:0)
确实HashSet会更好,但如果您想在此处执行此操作,请尝试此操作(假设您仅过滤重复的键):
foreach (var item in inputData.Keys)
{
if (itemStack.Where(x => x.Key == item.Key).Count() > 0)
// There was a duplicate
}
或者,如果你只关心数据何时出来,你可以致电:
itemStack.Distinct()
答案 2 :(得分:0)
我认为,你的方式是正确的。在我看来,HashSet很好,但是当你添加一个新元素时,它会对相同项目的内容执行相同的测试。
问候。
答案 3 :(得分:0)
根据您的初始问题陈述,您可能会执行以下操作:
var aggregateKnownKeys = itemStack.SelectMany(d => d.Keys);
itemStack.AddRange(
inputData.Select(d=> d.Where(p => !aggregateKnownKeys.Contains(p.Key))
.ToDictionary(p => p.Key, p => p.Value)));
如果您只需要组合两个词典,那么您可以跳过itemStack中存在的键:
var inputData = new Dictionary<string, string>();
var itemStack = new Dictionary<string, string>();
var oldStack = itemStack;
itemStack = new[] { inputData.SkipWhile(d => oldStack.Keys.Contains(d.Key)), itemStack }
.SelectMany(d => d)
.ToDictionary(d => d.Key, d => d.Value);
答案 4 :(得分:0)
好的,所以这不是一个完整的答案,但这就是我所做的。
所以我有一个项目列表,而不是完全比较列表中的什么(因此另一个考虑)我只做了一个项目检查:
if(!String.IsNullOrEmpty(item["itemId"]))
{
alert.DaleksApproaching(item["itemId"]);
}
所以,当它确实看到它有一个值时,它只是做另一个事件来摆脱它。 使用LINQ的想法和方法接近(包含和区别)我喜欢。我还没试过,但我打算这样做。为此,它不使用LINQ :(
谢谢大家!