Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

I am a newbie in C#, and I am having problems.

I have 2 List, 2 strings and a getCombinations(string) method that returns all combinations of a string as List;

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?

Thanks in advance.

like image 474
Nikko Guevarra Cabang Avatar asked Oct 13 '13 04:10

Nikko Guevarra Cabang


1 Answers

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
like image 109
Damith Avatar answered Sep 28 '22 06:09

Damith