我有一个
List<string> notizen = new List<string>();
我想从中选择一个随机条目,但在显示所有通知条目之前,不应重复此条目。
应用程序如下所示:
字符串在屏幕上,您点击它,屏幕上会出现另一个文本。我想随机浏览通知列表而没有重复条目,直到所有条目都显示出来,然后它从一个新的随机版本的通知开始。
notizen 可以自己随机化,不需要临时列表。但我发现 LINQ 在 monodroid 中不存在。
我有一个
List<string> notizen = new List<string>();
我想从中选择一个随机条目,但在显示所有通知条目之前,不应重复此条目。
应用程序如下所示:
字符串在屏幕上,您点击它,屏幕上会出现另一个文本。我想随机浏览通知列表而没有重复条目,直到所有条目都显示出来,然后它从一个新的随机版本的通知开始。
notizen 可以自己随机化,不需要临时列表。但我发现 LINQ 在 monodroid 中不存在。
您可以使用Fisher-Yates算法对列表进行洗牌O(n)
;一旦您的迭代器等于 n,执行第二次随机播放,依此类推。
如维基百科中所述,它的伪代码是:
To shuffle an array a of n elements (indices 0..n-1):
for i from n − 1 downto 1 do
j ← random integer with 0 ≤ j ≤ i
exchange a[j] and a[i]
您甚至可以为此编写一个扩展方法,例如:
public static Random rand = new Random();
public static List<T> Shuffle<T>(this List<T> original)
{
List<T> lst = new List<T>(original);
for (int i = lst.Count - 1; i >= 1; i--)
{
int j = rand.Next(0, i + 1);
T tmp = lst[j];
lst[j] = lst[i];
lst[i] = tmp;
}
return lst;
}
这样你就可以生成你的洗牌列表
var shuffled = notizen.Shuffle();