从Array显示字符串而不重复

时间:2013-12-02 06:31:30

标签: c# asp.net arrays list counter

我在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次然后停止。我已经尝试使用列表并删除我使用的字符串,但似乎在使用完所有字符串后重复。

如果需要更多代码我可以提供,只需要一个正确方向的点。

4 个答案:

答案 0 :(得分:0)

几个选项:

  1. 拥有一个数组或列表,它是主数组的副本,每当您选择一个数组或列表时,将其从数组中删除。一旦数组为空,请从主数组中刷新它。

  2. 类似,只需创建您的数组,随机播放它,然后按顺序开始发出字符串。所以数组[0],接下来是数组[1],依此类推,一旦你到达终点,随机播放并重新开始。

  3. 可能还有其他人:)


    修改
    如果我从评论中正确理解,那么您正在讨论输入不是唯一的选项。如果是这种情况,您可以使用简单的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(),则变量将被重新播种,您将获得与之前生成的结果完全不同的结果。