C# 检查一个字符串中的所有字符是否严格存在于另一个字符串中(无 LINQ)
C# check if strictly all characters in one string exist in another (NO LINQ)
我有一本字典,我想删除以某种方式包含给定单词的所有字符的所有键。例如,如果给定的单词是损坏的,则应删除所有带有“cor rupt”、“co2rrupt”、“ruptcor”等键的 key/pair 值。
到目前为止,我有以下代码,但它似乎不起作用,我不确定为什么。
static Dictionary<string,double> Dict2(){
var dict = new Dictionary < string, double > ();
dict.Add("rupt cor0",1);
dict.Add("cor rupt1", 33);
dict.Add(" 4 cor ru pt4", 10752);
dict.Add("ted45", 6.878);
dict.Add("key2", 0.0033482143);
var word = "corrupt";
Console.WriteLine("This is the origina dictionary");
foreach (KeyValuePair<string, double> kvp in dict)
{
Console.WriteLine($"Key {kvp.Key}: Value={kvp.Value}");
}
foreach (KeyValuePair<string, double> entry in dict)
{
foreach (char character in word)
{
if (entry.Key.Contains(character))
{
dict.Remove(entry.Key);
}
}
}
这段代码应该删除前 3 对,但是当我删除这些对后重新打印 dict 时,它只包含 key2:0.0033482143.
我想要一种不使用 LINQ 的方法。
由于在corrupt和t[=17=中匹配t,因此应删除第4个元素]ed45
此外,您应该以相反的顺序迭代您正在修改的列表。
var dict = new Dictionary<string, double>();
dict.Add("rupt cor0", 1);
dict.Add("cor rupt1", 33);
dict.Add(" 4 cor ru pt4", 10752);
dict.Add("ted45", 6.878);
dict.Add("key2", 0.0033482143);
var word = "corrupt";
Console.WriteLine("This is the origina dictionary");
foreach (KeyValuePair<string, double> kvp in dict)
{
Console.WriteLine($"Key {kvp.Key}: Value={kvp.Value}");
}
for (int i = dict.Keys.Count - 1; i >= 0; i--)
{
var entry = dict.ElementAt(i);
foreach (char character in word)
{
if (entry.Key.Contains(character))
{
Console.WriteLine($"Entry `{entry.Key}` contains `{character}`. Remove");
dict.Remove(entry.Key);
break;
}
}
}
Console.WriteLine("This is the modified dictionary");
foreach (KeyValuePair<string, double> kvp in dict)
{
Console.WriteLine($"Key {kvp.Key}: Value={kvp.Value}");
}
一种方法是遍历所有键,如果键的长度至少与单词一样长,则遍历单词的每个字符并将其从键中删除。那么如果我们已经删除了所有的字符,那么这个键应该被删除,因为它包含了所有的字符。这需要创建一个临时变量来存储键值和词值,因为我们不想修改原始值。
var keysToRemove = new List<string>();
foreach (var key in dict.Keys)
{
if (key.Length < word.Length) continue;
var tmpKey = key;
var tmpWord = word;
foreach (var chr in word)
{
var keyIndex = tmpKey.IndexOf(chr);
if (keyIndex < 0) break;
tmpKey = tmpKey.Remove(keyIndex, 1);
tmpWord = tmpWord.Remove(0, 1);
}
if (tmpWord.Length == 0) keysToRemove.Add(key);
}
foreach (var keyToRemove in keysToRemove)
{
dict.Remove(keyToRemove);
}
我有一本字典,我想删除以某种方式包含给定单词的所有字符的所有键。例如,如果给定的单词是损坏的,则应删除所有带有“cor rupt”、“co2rrupt”、“ruptcor”等键的 key/pair 值。
到目前为止,我有以下代码,但它似乎不起作用,我不确定为什么。
static Dictionary<string,double> Dict2(){
var dict = new Dictionary < string, double > ();
dict.Add("rupt cor0",1);
dict.Add("cor rupt1", 33);
dict.Add(" 4 cor ru pt4", 10752);
dict.Add("ted45", 6.878);
dict.Add("key2", 0.0033482143);
var word = "corrupt";
Console.WriteLine("This is the origina dictionary");
foreach (KeyValuePair<string, double> kvp in dict)
{
Console.WriteLine($"Key {kvp.Key}: Value={kvp.Value}");
}
foreach (KeyValuePair<string, double> entry in dict)
{
foreach (char character in word)
{
if (entry.Key.Contains(character))
{
dict.Remove(entry.Key);
}
}
}
这段代码应该删除前 3 对,但是当我删除这些对后重新打印 dict 时,它只包含 key2:0.0033482143.
我想要一种不使用 LINQ 的方法。
由于在corrupt和t[=17=中匹配t,因此应删除第4个元素]ed45
此外,您应该以相反的顺序迭代您正在修改的列表。
var dict = new Dictionary<string, double>();
dict.Add("rupt cor0", 1);
dict.Add("cor rupt1", 33);
dict.Add(" 4 cor ru pt4", 10752);
dict.Add("ted45", 6.878);
dict.Add("key2", 0.0033482143);
var word = "corrupt";
Console.WriteLine("This is the origina dictionary");
foreach (KeyValuePair<string, double> kvp in dict)
{
Console.WriteLine($"Key {kvp.Key}: Value={kvp.Value}");
}
for (int i = dict.Keys.Count - 1; i >= 0; i--)
{
var entry = dict.ElementAt(i);
foreach (char character in word)
{
if (entry.Key.Contains(character))
{
Console.WriteLine($"Entry `{entry.Key}` contains `{character}`. Remove");
dict.Remove(entry.Key);
break;
}
}
}
Console.WriteLine("This is the modified dictionary");
foreach (KeyValuePair<string, double> kvp in dict)
{
Console.WriteLine($"Key {kvp.Key}: Value={kvp.Value}");
}
一种方法是遍历所有键,如果键的长度至少与单词一样长,则遍历单词的每个字符并将其从键中删除。那么如果我们已经删除了所有的字符,那么这个键应该被删除,因为它包含了所有的字符。这需要创建一个临时变量来存储键值和词值,因为我们不想修改原始值。
var keysToRemove = new List<string>();
foreach (var key in dict.Keys)
{
if (key.Length < word.Length) continue;
var tmpKey = key;
var tmpWord = word;
foreach (var chr in word)
{
var keyIndex = tmpKey.IndexOf(chr);
if (keyIndex < 0) break;
tmpKey = tmpKey.Remove(keyIndex, 1);
tmpWord = tmpWord.Remove(0, 1);
}
if (tmpWord.Length == 0) keysToRemove.Add(key);
}
foreach (var keyToRemove in keysToRemove)
{
dict.Remove(keyToRemove);
}