foreach循环一次在字典中

时间:2013-11-29 07:22:33

标签: c# wpf dictionary foreach shuffle

这是我在下面的事件按钮单击处理程序中的代码。每当我点击一次它会随机化图像。是否有可能的解决方案让我的代码循环一次而不是无限次循环点击。

我正在做一个图片匹配记忆游戏,所以当我点击按钮时它会保持随机化。

shuffled01 = dict01.Shuffle();

void btn_Click(object sender, EventArgs e)
{
    foreach (var a in shuffled01)
    {
        button.Name = "a" + a.Key.ToString();
        button.MinHeight = 100;
        button.MinWidth = 100;
        //   button.Name = "a" + a.Key.ToString();
        ImageBrush brush = new ImageBrush();
        BitmapImage bitmap = new BitmapImage();
        button.Background = brush;
        bitmap.BeginInit();
        bitmap.UriSource = new Uri(@"C:\inetpub\wwwroot\istellar 22-10-13\iStellarMobile\iStellarMobile\" 
            + a.Value.ToString().Substring(1), UriKind.Absolute);
        bitmap.ToString();
        bitmap.EndInit();
        brush.ImageSource = bitmap;
    }
}

提前致谢。

3 个答案:

答案 0 :(得分:0)

您似乎需要在字典中随机播放键,然后重复它们。在这种情况下,我会按如下方式进行:

void Main()
{
    var dic = new Dictionary<string, string>();

    dic.Add("a", "b");
    dic.Add("c", "s");
    dic.Add("d", "2");
    dic.Add("e", "r");
    dic.Add("f", "g");

    var range = Enumerable.Range(0, dic.Keys.Count()).Shuffle(); 

    var kArr = dic.Keys.ToArray();
    foreach (var num in range) {
        var key = kArr[num];
        Console.WriteLine("{0}, {1}", key, dic[key]);
    }


}

// take shuffling from here : https://stackoverflow.com/questions/5807128/an-extension-method-on-ienumerable-needed-for-shuffling
public static class Ext {
    public static IEnumerable<T> Shuffle<T>(this IEnumerable<T> source)
    {
        var rng = new Random();
        return source.Shuffle(rng);
    }

    public static IEnumerable<T> Shuffle<T>(this IEnumerable<T> source, Random rng)
    {
        if (source == null) throw new ArgumentNullException("source");
        if (rng == null) throw new ArgumentNullException("rng");

        return source.ShuffleIterator(rng);
    }

    private static IEnumerable<T> ShuffleIterator<T>(
        this IEnumerable<T> source, Random rng)
    {
        var buffer = source.ToList();

        for (int i = 0; i < buffer.Count; i++)
        {
            int j = rng.Next(i, buffer.Count);
            yield return buffer[j];

            buffer[j] = buffer[i];
        }
    }
}

示例结果: 第一次运行 d,2 / f,g / e,r / c,s / a,b

第二轮 a,b / e,r / f,g / c,s / d,2

PS我在这里使用了洗牌An extension method on IEnumerable needed for shuffling

答案 1 :(得分:0)

是否有可能的解决方案让我的代码循环一次而不是无限次循环点击。

所以你的意思是你只需要运行一次?,不是

private bool isRunned;

会解决吗?然后在运行后将其设置为true,或者您可以通过

取消订阅按钮的事件
button.Click -= click_handler;

答案 2 :(得分:0)

你使用休息;找到匹配时的关键字

foreach (var a in shuffled01)
{
if(CondStatisfied == true)
{
  break;
}
}