gpt4 book ai didi

c# - 在 C# 列表中标记位置

转载 作者:行者123 更新时间:2023-11-30 19:09:12 25 4
gpt4 key购买 nike

我有一个从字典文件中读入的字符串列表(按字母顺序排序)。我想为每个起始字母的最后位置创建一个索引,所以如果有 1000 个以 A 开头的单词,它将被记录为位置 999(因为数组从 0 开始)。以 B 开头的 1000 个单词表示 B 的结束位置是 1999 等等。这些位置值将存储在一个 int 数组中。

我能想到的唯一方法是遍历整个列表,并有很多 else if 语句来查看单词的第一个字母。不是最优雅的解决方案。

有谁知道一个简单的方法来做到这一点,而不是 26 个 if 语句?

编辑:这样做的目的是生成随机词。如果我想要一个以 B 开头的单词,我会生成一个介于 1000 和 1999 之间的随机数,并从列表中的那个位置获取单词。

最佳答案

好吧,您可以使用 LINQ 创建字典:

// Note: assumes no empty words
Dictionary<char, int> lastEntries = words
.Select((index, value) => new { index, value })
.GroupBy(pair => pair.value[0])
.ToDictionary(g => g.Key, g => g.Max(p => p.index));

或者更有用的是,保留第一个和最后一个索引:

Dictionary<char, Tuple<int, int>> entryMinMax = words
.Select((value, index) => new { value, index })
.GroupBy(pair => pair.value[0])
.ToDictionary(g => g.Key,
g => Tuple.Of(g.Min(p => p.index), g.Max(p => p.index));

或者,如果重点是按首字母有效地对单词进行分组,只需使用查找即可:

ILookup<char, string> lookup = words.ToLookup(word => word[0]);

然后你可以使用:

char first = 'B'; // Or whatever
Random rng = new Random(); // But don't create a new one each time...
var range = lookup[first];
var count = range.Count();
if (count == 0)
{
// No words starting with that letter!
}
int index = random.Next(count);
var randomWord = range.ElementAt(index);

关于c# - 在 C# 列表中标记位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31248470/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com