C# (String.StartsWith && !String.EndsWith && !String.Contains) 使用列表
Posted
技术标签:
【中文标题】C# (String.StartsWith && !String.EndsWith && !String.Contains) 使用列表【英文标题】:C# (String.StartsWith && !String.EndsWith && !String.Contains) using a List 【发布时间】:2013-10-20 22:33:34 【问题描述】:我是 C# 的新手,我遇到了问题。
我有 2 个列表、2 个字符串和一个 getCombinations(string) 方法 将字符串的所有组合作为列表返回;
我如何验证 subjectStrings 元素是否不存在 StartWith && !EndsWith && !Contains (或 !StartWith && !EndsWith && Contains 等) 对于startswithString、endswithString 和 containsString 的每种组合?
这是我在 StartWith && !EndsWith 中的代码 (如果你想看到它运行: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;
输出:
con
cot
cone
conn
cote <<<
conte <<<
concent
connect
Done
if(z.StartsWith(a) && !z.EndsWith(b)) var b 可以是 "et" 和 "te",但 cote 和 conte 以 "te" 结尾, 为什么它仍然添加到我的验证字符串中?
提前致谢。
【问题讨论】:
对于此类问题,您可以使用递归函数,请您提供更多示例,让我确切了解函数应作为输出返回的内容。 【参考方案1】:z.StartsWith(a) && !z.EndsWith(b)
检查下面的组合
z ="cote"
a ="co"
b ="te"
所以 z 以“co”开头,z 不以“te”结尾,您的条件通过,cote
将添加到列表中
我会尝试如下
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
输出:
con
cot
cone
conn
concent
connect
【讨论】:
这在这种情况下效果很好,然后尝试将它与“aa”的排列一起使用到另一个 List foreach(var b in getCombinations(endswithString))
if(z.StartsWith(a) && !z.EndsWith(b))
valid = true;
break;
在这里,只要 !z.EndsWith(b) 匹配,您就将 valid 设置为 true,并且您没有遍历可用排列的整个列表。 因为“cote”不以“et”结尾,所以它是一个匹配项,valid 设置为 true 并且代码中断。 这就是为什么将“cote”添加到您的有效字符串列表中的原因。 “conte”也是如此。
你想做的是:
List<string> startsWithCombination = getCombinations("co");
List<string> endsWithCombination = getCombinations("et");
foreach (var z in subjectStrings)
bool isStartMatchFound = startsWithCombination.Any(b => z.StartsWith(b));
if (isStartMatchFound)
bool isEndMatchFound = endsWithCombination.Any(b => z.EndsWith(b));
if (!isEndMatchFound)
validatedStrings.Add(z);
【讨论】:
以上是关于C# (String.StartsWith && !String.EndsWith && !String.Contains) 使用列表的主要内容,如果未能解决你的问题,请参考以下文章
如何检查一个字符串“StartsWith”是不是是另一个字符串?
javascript中String.startswith和String.endsWidth 与 es6中的 startswith 和 endsWidth
LINQ to Entities 和 String.StartsWith 的问题
Ruby 是不是有一个 string.startswith("abc") 内置方法?