我在c#asp.net上开展一个项目。我想从数组或列表中随机显示一个字符串,如果满足某些条件,我想显示另一个未显示的随机字符串。
EX。
LIST<string> myString = new List<string> {"one", "two", "three", "four", "five"};
或
string[] myString = new[] {"one", "two", "three", "four", "five"};
void btnAnswer_Click(Object sender, EventArgs e)
{
string Next = myString[random.Next(myString.Length)];
if(my condition is met)
{
lbl.Text = Next;
}
}
我可以从列表或数组中随机调用一个字符串,但不知道如何存储重复结果。我已经尝试过使用一种算法来混淆数组,然后使用一个计数器作为索引,但计数器(计数器++)似乎加1次然后停止。我已经尝试使用列表并删除我使用的字符串,但似乎在使用完所有字符串后重复。
如果需要更多代码我可以提供,只需要一个正确方向的点。
答案 0 :(得分:0)
几个选项:
拥有一个数组或列表,它是主数组的副本,每当您选择一个数组或列表时,将其从数组中删除。一旦数组为空,请从主数组中刷新它。
类似,只需创建您的数组,随机播放它,然后按顺序开始发出字符串。所以数组[0],接下来是数组[1],依此类推,一旦你到达终点,随机播放并重新开始。
可能还有其他人:)
修改强>
如果我从评论中正确理解,那么您正在讨论输入不是唯一的选项。如果是这种情况,您可以使用简单的linq查询创建列表,以仅获取唯一值(使用distinct),保证不重复。
请查看this question示例。
答案 1 :(得分:0)
您可以将索引复制到列表中,它会节省内存,同时允许我们跟踪所有剩余项目:
var indices = Enumerable.Range(0,myString.Count).ToList();
//define some method to get next index
public int? NextIndex(){
if(indices.Count == 0) return null;
int i = random.Next(indices.Count);
int k = indices[i];
indices.RemoveAt(i);
return k;
}
if(my condition is met) {
int? nextIndex = NextIndex();
lbl.Text = nextIndex == null ? "" : myString[nextIndex.Value];
}
请注意,如果没有剩余的字符串,Text
将设置为空,但您可以通过其他方式自行处理该情况,例如保持文本不变。
答案 2 :(得分:0)
一种选择是显示随机字符串之一并将其存储在 ViewState 中。
下次再次来时,请检查 ViewState 中是否已存在新的随机字符串。如果它在ViewState中,那么获取另一个随机字符串。
答案 3 :(得分:0)
你可能会这样做,但为什么不先获得一个独特的字符串列表?
var uniqueStrings = myString.Distinct().ToList();
然后在选择字符串时,对.Remove()
中最后一个随机选择的值执行uniqueStrings
。
你这么说:
我尝试使用列表并删除我使用的字符串,但似乎在使用完所有字符串后重复。
这里的问题是在你用完之后为你的系列使用相同的random
实例。如果您重新实例化random = new Random()
,则变量将被重新播种,您将获得与之前生成的结果完全不同的结果。