能够搜索列表以匹配具有特定位置字母的单词

时间:2015-10-11 21:47:23

标签: string list

目前游戏从字典中随机选择一个存储在列表中的单词,游戏功能完全符合我的需要。

我要做的下一步是一种模式,游戏有能力通过搜索字典中的单词列表并更改玩家必须用另一个单词猜测的单词来作弊。我遇到的障碍是,如果玩家已经猜到了一些字母,那么这个单词只能用包含相同位置字母的单词来改变。

例如,如果要猜测的所选单词是:" Clock"并且玩家已经猜到了字母" L"," O"和" K"唯一的选择是用相同位置的那些字母用另一个单词改变单词(例如" Block&#34 ;.)

这就是我被困住的地方,并且想知道是否有办法在列表中搜索包含猜测字母位置中字母的单词。

非常感谢。

3 个答案:

答案 0 :(得分:0)

我很想用正则表达式来解决这个问题。

用'\ w'替换每个未加标签的字符,然后使用Linq你会有这样的东西:

    private List<string> FindPossibleWords(string guess, List<string> words)
    {
        Regex rg = new Regex(guess); //must have replaced unknowns with '\w'
        return words.Where(w => rg.IsMatch(w)).ToList();
    }

因此,例如,您可以使用字符串“\ wlo \ wk”和单词列表(您的“词典”)调用此方法。

然后返回可能匹配的列表。您选择哪一个取决于您。

干杯

答案 1 :(得分:0)

如果您有索引和char,例如

int index = 3;
char c = 'c';

你可以这样过滤字典:

List<string> filtered = words.Where((str => str.ElementAtOrDefault(index) == c)).ToList();

例如:

List<string> words = new List<string> { "Block", "Clock", "Work", "Orange" };

List<string> filtered = words.Where((str => str.ElementAtOrDefault(index) == c)).ToList();

filtered仅包含&#34; Block&#34;和&#34;时钟&#34;。如果您有多个此类要求,则可以相应地链接Where子句。

答案 2 :(得分:0)

如果您从单词词典开始,例如:

var dictionary = new List<string>()
{
    "clock",
    "block",
    "crock",
    "black",
};

并且可以将当前猜测表示为char?[],如下所示:

var guess = new char?[] { null, 'L', 'O', null, 'K' };

然后找到匹配单词的方法很容易就像这样:

var matches =
    dictionary
        .Select(word => word.ToUpperInvariant())
        .Where(word => word.Zip(guess, (w, g) => g == null || w == g).All(x => x))
        .ToList();

这计算:

CLOCK 
BLOCK