c# - 从Dictionary中删除最后n个元素

时间:2018-04-11 19:47:17

标签: c# dictionary

如何从字符串Dictionary中删除最后2个keyValuePairs,其中键以“MyKey_”开头?

var myDict = new Dictionary<string, string>();    

myDict.Add("SomeKey1", "SomeValue");
myDict.Add("SomeKey2", "SomeValue");
myDict.Add("MyKey_" + Guid.NewGuid(), "SomeValue");
myDict.Add("MyKey_" + Guid.NewGuid(), "SomeValue");
myDict.Add("MyKey_" + Guid.NewGuid(), "SomeValue");

编辑:

var noGwInternal = myDict.Where(o => !o.Key.StartsWith("MyKey_")).ToDictionary(o => o.Key, o => o.Value);
var gwInternal = myDict.Where(o => o.Key.StartsWith("MyKey_")).ToDictionary(o => o.Key, o => o.Value);

如何从这里前进?需要从gwInternal中删除2个项目,然后将noGwInternal + gwInternal放入一个新的词典中

2 个答案:

答案 0 :(得分:1)

这应该做你正在尝试做的事情(根据你在评论中发布的内容)。

(编辑:看起来你替换了你的评论,现在我不确定你是按照字母顺序排列......)

var myDict = new Dictionary<string, string>();    

myDict.Add("SomeKey1", "SomeValue");
myDict.Add("SomeKey2", "SomeValue");
myDict.Add("MyKey_B" + Guid.NewGuid(), "SomeValue");
myDict.Add("MyKey_A" + Guid.NewGuid(), "SomeValue");
myDict.Add("MyKey_C" + Guid.NewGuid(), "SomeValue");

var pairsToRemove = myDict.Where(x => x.Key.StartsWith("MyKey_"))
                          .OrderByDescending(x => x.Key)
                          .Take(2);

foreach (var pair in pairsToRemove)
{
    myDict.Remove(pair.Key);
}

foreach (var pair in myDict)
{
    Console.WriteLine(pair);
}

输出:(MyKey_B和MyKey_C已删除)

[SomeKey1, SomeValue]
[SomeKey2, SomeValue]
[MyKey_Ad6c3a25d-5d8c-44e4-9651-39164c0496fc, SomeValue]

我喜欢tevemadar提到的有关OrderedDictionary的内容......我不确定它是否适合您尝试做的事情,但它值得一试看。

答案 1 :(得分:1)

不确定你的意思&#39; last&#39;,因为这是一个字典(没有顺序),但是这个代码将按照它们在循环中遇到的顺序删除最后2个。

List<string> toRemove = new List<string>();  
foreach(KeyValuePair pair in myDict.Reverse())
{
     if(pair.key.StartsWith("MyKey_"))
     {
           toRemove.Add(pair.key);
           toRemoveCount--;
     }

     if(toRemove.Count == 2)
     {
           break;
     }
}

foreach(string str in toRemove)
{
      myDict.Remove(str);
}