2016-08-10 33 views
1

我正在使用c#winforms。当我点击一个按钮时,程序会显示列表中的2个单词,但有时单词会重复。如何我不给不让的话重复千万不要重复一些名字

这是代码

private void button1_Click(object sender, EventArgs e) 
{ 
    var words = new[] { "Worm", "Fast", "Death", "boat", "Sneak", "Destroction" }; 
    var wordsInRandomOrder = words.OrderBy(i => Guid.NewGuid()); 

    foreach (var word in wordsInRandomOrder) 
    { 
     textBox1.Text = word; 
     break; 
    } 

    foreach (var word in wordsInRandomOrder) 
    { 
     textBox1.Text = textBox1.Text + " " + word; 
     break; 
    } 
} 
+2

为什么不'textBox1.Text = string.Join(“”,wordsInRandomOrder.Take(2));'? – juharr

+0

@juharr我是新的c# – Pedro

+3

任何时候你有一个循环,你总是在* first *迭代之后中断,因此你可能不需要循环。 – David

回答

1

选项1:

private void button1_Click(object sender, EventArgs e) 
{ 
    var words = new[] { "Worm", "Fast", "Death", "boat", "Sneak", "Destroction" }; 
    var wordsInRandomOrder = words.OrderBy(i => Guid.NewGuid()).ToList(); 
    textBox1.Text = wordsInRandomOrder[0] + " " + wordsInRandomOrder[1]; 
} 

选项2:

var words = new[] { "Worm", "Fast", "Death", "boat", "Sneak", "Destroction" }; 
Random rd = new Random(); 

int firstIndex = rd.Next(0, words.Length); 
int secondIndex = rd.Next(0, words.Length); 

while (secondIndex == firstIndex) 
{ 
    secondIndex = rd.Next(0, words.Length); 
} 

textBox1.Text = words[firstIndex] + " " + words[secondIndex]; 
+0

它不工作 – Pedro

+0

@HimBromBeere你是对的 – Pedro

+0

@HimBromBeere是的,你是绝对正确的xD – mjb

0
Random rd = new Random(); 

int firstIndex = rd.Next(0, words.Length); 
int secondIndex = rd.Next(0, words.Length); 

while (secondIndex == firstIndex) 
{ 
    secondIndex = rd.Next(0, words.Length); 
} 

textBox1.Text = words[firstIndex] + " " + words[secondIndex]; 
+0

我在哪里放名单? “Worm”,“Fast”,“Death”,“boat”,“Sneak”,“Destroction” – Pedro

+0

在这行前面声明一个字符串数组“Random rd = new Random()”,就像你在你的代码:var words = new [] {“Worm”,“Fast”,“Death”,“boat”,“Sneak”,“Destroction”}; – mjb

+0

对不起,但juharr已经帮助我,但thx无论如何 – Pedro

0

一类似的方法,不会使用Guid

private void button1_Click(object sender, EventArgs e) 
{ 
    Random r = new Random(); 
    var words = new[] { "Worm", "Fast", "Death", "boat", "Sneak", "Destroction" }; 
    var wordsInRandomOrder = words.OrderBy(i => r.Next()).ToList(); 

    textBox1.Text = String.Join(" ", wordsInRandomOrder.Take(2)); 
} 

随着甚至如果随机数发生器产生两次相同的数,你从你的列表中取一个字,因为他们只是下令这appraoch(这是相当不可能的)。如果两件商品具有相同的订单价值,则它们可以任意订购,但同一件商品不能使用两次。

+0

只能使用'r.Next()',因为该值仅用于排序而不是索引。 – juharr

+0

@juharr是的,你是对的,更新 – HimBromBeere

0

如果realllllly想保持你使用,在第二foreach的代码,你可以这样做:

foreach (var word in wordsInRandomOrder) 
{ 
    if(word != textBox1.Text) 
    { 
     textBox1.Text = textBox1.Text + " " + word; 
     break; 
    } 
} 

,但更好的办法是为juharr写道:

textBox1.Text = string.Join(" ", wordsInRandomOrder.Take(2)); 

如果你想走循环路线,最好加入 这两个“foreach es”你有这样的样子:

foreach (string word in wordsInRandomOrder) 
{ 
    if(textBox1.Text = "") 
    { 
     textBox1.Text = word; 
    } 
    else 
    { 
     if(textBox1.Text != word) 
     { 
      textBox1.Text = textBox1.Text + " " + word; 
      break; 
     } 
    } 
} 
+0

thx的帮助,但mjb做得很好 – Pedro