假设我List<string> FontStyle
包含以下内容
"a0.png",
"b0.png",
"b1.png",
"b2.png",
"b3.png",
"c0.png",
"c1.png",
"d0.png",
"d1.png",
"d2.png"
我想从列表中随机选择一个字符串,其第一个字符与某个字符匹配。例如,如果角色是c
。该方法将随机返回c0.png
或c1.png
。
如何使用LINQ执行此操作?
答案 0 :(得分:5)
这应该可以解决问题:
var random = new Random();
var list = new List<string> {
"a0.png",
"b0.png",
"b1.png",
"b2.png",
"b3.png",
"c0.png",
"c1.png",
"d0.png",
"d1.png",
"d2.png"
};
var startingChar = "d";
var filteredList = list.Where(s => s.StartsWith(startingChar)).ToList();
Console.WriteLine(filteredList.Count);
int index = random.Next(filteredList.Count);
Console.WriteLine(index);
var font = filteredList[index];
Console.WriteLine(font);
但整个解决方案的问题在于,生成的过滤列表越小,您获得真正随机值的可能性就越小。 Random
类在更大的约束条件下效果更好 - 所以请记住这一点。
答案 1 :(得分:4)
Random random = ...;
var itemsStartingWithC = input
.Where(x => x.StartsWith("c"))
.ToList();
var randomItemStartingWithC =
itemsStartingWithC.ElementAt(random.Next(0, itemsStartingWithC.Count()));
对ToList
的调用并非绝对必要,但在此实例中会产生更快的代码。没有它,Count()
将完全枚举,ElementAt
将需要枚举到随机选择的索引。