【问题标题】:foreach loop once in dictionaryforeach 在字典中循环一次
【发布时间】:2013-11-29 07:22:32
【问题描述】:

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

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

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;
    }
}

提前致谢。

【问题讨论】:

  • 如何使用 Random
  • infinity looping 是指循环 shuffled01 的长度?
  • 是的,我把我的字典随机打乱了
  • 您的代码只会循环一次,因为您使用的是 foreach 并且您没有在循环期间更改集合(无论如何,这在 C# 中是不允许的)。如果单击您的按钮会挂起您的应用程序,则问题出在其他地方。

标签: c# wpf dictionary foreach shuffle


【解决方案1】:

您似乎需要对字典中的键进行洗牌,然后对其进行迭代。在这种情况下,我会这样做:

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,克/ e, r / CS / 一个,b

第二次运行 一,乙/ e, r / f,克/ CS / d, 2

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

【讨论】:

    【解决方案2】:

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

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

    private bool isRunned;
    

    会解决吗?然后在运行后将其设置为true,或者您可以取消订阅按钮的事件

    button.Click -= click_handler;
    

    【讨论】:

      【解决方案3】:

      你使用break;找到匹配项时的关键字

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-03-11
        • 1970-01-01
        • 2012-07-27
        • 1970-01-01
        • 2013-12-24
        • 1970-01-01
        • 2023-04-11
        相关资源
        最近更新 更多