【问题标题】:C# check if strictly all characters in one string exist in another (NO LINQ)C# 严格检查一个字符串中的所有字符是否存在于另一个字符串中(无 LINQ)
【发布时间】:2021-03-15 03:25:49
【问题描述】:

我有一本字典,我想删除以某种方式包含给定单词的所有字符的所有键。例如,如果给定的单词已损坏,则应删除所有带有“corrupt”、“co2rrupt”、“ruptcor”等键的键/对值。

到目前为止,我有以下代码,但它似乎不起作用,我不知道为什么。

        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 对,但是当我在删除这些对后重新打印字典时,它只包含 key2:0.0033482143。

我想要一种不使用 LINQ 的方法。

【问题讨论】:

  • 这个限制似乎有点武断。为什么没有 LINQ?这“只是”一堆让生活变得如此轻松的扩展方法。您可以自己重新实现所有这些...无论如何,我可能会从将“搜索词”作为字符列表之类的东西开始。然后遍历键的每个字符,检查它是否为[a-zA-Z] 并从列表中删除它的第一次出现。如果列表为空且键中仍有此类字符,则为“假”。仅当键末尾的列表为空时,它才是“真”。 (每个键后重置列表!)
  • @Corak 可能是作业之类的,如果没有 LINQ,老师可能会对学生的思维方式有更多的了解。
  • 这只是在没有 LINQ 和其他库的情况下实现这一点的练习。
  • " 它似乎不起作用,我不知道为什么。" 您的最后一个 foreach 将检查字典中的 Key 是否包含来自word,如果是,它将删除整个条目。

标签: c# string loops substring


【解决方案1】:

一种方法是遍历所有键,如果键长度至少与单词一样长,则遍历单词的每个字符并将其从键中删除。那么如果我们删除了所有的字符,那么这个键应该被删除,因为它包含了所有的字符。这需要创建一个临时变量来存储 key 和 word 值,因为我们不想修改原始变量。

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);
}

【讨论】:

    【解决方案2】:

    由于 corruptted45
    中的 t 匹配,应删除第 4 个元素 此外,您应该以相反的顺序迭代您正在修改的列表。

    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}");
    }
    

    【讨论】:

    • ted45 不包含corrupt 的所有字符,但已被删除。
    • ElementAt 是一种 LINQ 方法,但感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-04
    • 2011-03-24
    • 2011-02-07
    • 2019-05-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多