Search code examples
c#stringlinqcombinationsstartswith

C# (String.StartsWith && !String.EndsWith && !String.Contains) using a List


I have 2 List<string>s, 2 strings, and a getCombinations(string) method that returns all combinations of a string as a List<string>.

How do I validate if a subjectStrings element does not StartWith && !EndsWith && !Contains (or !StartWith && !EndsWith && Contains, etc.) for every combinations of startswithString, endswithString and containsString?

Here is my code in StartWith && !EndsWith (if you want to see it running: http://ideone.com/y8JZkK)

using System;
using System.Collections.Generic;
using System.Linq;

public class Test
{
        public static void Main()
        {
                List<string> validatedStrings = new List<string>();
                List<string> subjectStrings = new List<string>()
                {
                        "con", "cot", "eon", "net", "not", "one", "ten", "toe", "ton",
                                "cent", "cone", "conn", "cote", "neon", "none", "note", "once", "tone",
                                "cento", "conte", "nonce", "nonet", "oncet", "tenon", "tonne",
                                "nocent","concent", "connect"
                }; //got a more longer wordlist
        
                string startswithString = "co";
                string endswithString = "et";
        
                foreach(var z in subjectStrings)
                {
                    bool valid = false;
                    foreach(var a in getCombinations(startswithString))
                    {
                        foreach(var b in getCombinations(endswithString))
                        {
                            if(z.StartsWith(a) && !z.EndsWith(b))
                            {
                                    valid = true;
                                    break;
                            }
                        }
                        if(valid)
                        {
                            break;
                        }
                    }
                    if(valid)
                    {
                        validatedStrings.Add(z);
                    }
                }

                foreach(var a in validatedStrings)
                {
                        Console.WriteLine(a);
                }
                Console.WriteLine("\nDone");
        }

    
        static List<string> getCombinations(string s)
        {
                //Code that calculates combinations
                return Permutations.Permutate(s);
        }
}

public class Permutations
{
        private static List<List<string>> allCombinations;
        
        private static void CalculateCombinations(string word, List<string> temp)
        {
                if (temp.Count == word.Length)
                {
                        List<string> clone = temp.ToList();
                        if (clone.Distinct().Count() == clone.Count)
                        {
                                allCombinations.Add(clone);
                        }
                        return;
                }

                for (int i = 0; i < word.Length; i++)
                {
                        temp.Add(word[i].ToString());
                        CalculateCombinations(word, temp);
                        temp.RemoveAt(temp.Count - 1);
                }
        }
        
        public static List<string> Permutate(string str)
        {
                allCombinations = new List<List<string>>();
                CalculateCombinations(str, new List<string>());
                List<string> combinations = new List<string>();
                foreach(var a in allCombinations)
                {
                        string c = "";
                        foreach(var b in a)
                        {
                                c+=b;
                        }
                        combinations.Add(c);
                }
                return combinations;
        }
}

Output:

con 
cot
cone
conn
cote <<<
conte <<<
concent
connect

Done

if(z.StartsWith(a) && !z.EndsWith(b)) var b can be "et" and "te", but cote and conte endswith "te", why it is still added in my validated strings?


Solution

  • z.StartsWith(a) && !z.EndsWith(b)
    

    check below combination

    z ="cote"
    a ="co"
    b ="te"
    

    so z start with "co" and z not end with "te", your condition pass and cote will add to list

    i would try as below

    var sw =getCombinations(startswithString);
    var ew = getCombinations(endswithString);
    
    
    var result = subjectStrings.Where(z=> 
        sw.Any(x=>z.StartsWith(x) && 
            !ew.Any(y=>z.EndsWith(y))))
            .ToList();
    

    DEMO

    output :

    con
    cot
    cone
    conn
    concent
    connect