我有这个IEnumerable:
IEnumerable<MyObject>
Run Code Online (Sandbox Code Playgroud)
我需要随机订购MyObject列表.我需要强制转换为ArrayList吗?
或者我可以直接做到吗?谢谢
编辑
这是我的实际随机顺序函数:
IList<ArchiePacchettoOfferta> list = new List<ArchiePacchettoOfferta>(m_oEnum);
for (int i = 0; i < list.Count; ++i)
{
HttpContext.Current.Response.Write(list[i].Titolo + "<br />");
}
Random rnd = new Random();
for (int i = 0; i < list.Count; ++i)
{
int swapIndex = rnd.Next(i + 1);
ArchiePacchettoOfferta tmp = list[i];
list[i] = list[swapIndex];
list[swapIndex] = tmp;
}
for (int i = 0; i < list.Count; ++i)
{
HttpContext.Current.Response.Write(list[i].Titolo + "<br />");
}
Run Code Online (Sandbox Code Playgroud)
它每次以相同的方式命令列表:(
我记得看到一个方法似乎是排序,在哪里可以解开项目.
例如,我试图使用Random类显示从0到10的随机化项目.但我猜这不是最好的选择.
所以,我想为IEnumberable,List或数组创建扩展,无论什么都是最好的方法.
我有一个IEnumerable集合如下
var result1 = GetResult1() // Returns 2,4,5,6
Run Code Online (Sandbox Code Playgroud)
我必须以随机方式处理元素并创建另一个集合,结果如下:
var result2 = GetResult2(result1) // Returns 2,4,5,6 in a random order.
// An example output would be 4,6,2,5 in the resultant collection.
Run Code Online (Sandbox Code Playgroud)
我通过以下方式完成此操作:
var result1 = GetResult1();
var random = new Random();
var result2 = result1.OrderBy(order=>random.Next());
Run Code Online (Sandbox Code Playgroud)
然而,这个问题是如果我访问result2,result2中的元素会再次被洗牌,即如果我将result2的结果输出到控制台两次,则元素会再次变为juggled.
能告诉你如何保持这种制服.也就是说,一旦我处理了这个集合,它应该保持相同的方式.我必须使用懒惰的评估,因为结果非常大.
我经常在这里听到测试驱动的开发人员,有一个函数隐含地获取大量信息是一件坏事.我可以看到,从测试的角度来看,这会是不好的,但从封装的角度来看,它有时是不是必要吗?我想到以下问题:
使用Random和OrderBy是一个很好的shuffle算法吗?
基本上,有人想在C#中创建一个函数来随机地移动一个数组.有几个人告诉他应该将随机数生成器作为参数传入.这似乎是对我的一种严重违反封装,即使它确实使测试更容易.数组混洗算法除了数组之外是否需要任何状态,而不是调用者不应该关心的实现细节?获取此信息的正确位置是不是可能来自线程本地单例?
我制作了这段代码,将大约8种不同的纹理加载到具有纹理属性的对象列表中.
我有一个名为"1.png,2.png,3.png,.......,46.png"的纹理文件夹,我希望8个不同的对象加载随机选择的纹理.
DockedFruitsList = new List<Fruit>(8);
for (int i = 0; i < 8; i++)
{
Fruit temp = new Fruit();
temp = new Fruit();
temp.Position = AvailablePositions[i];
int random=(new Random().Next(0, 4600) % 46);
temp.Texture = Content.Load<Texture2D>(@"Fruits/" + random);
DockedFruitsList.Add(temp);
}
Run Code Online (Sandbox Code Playgroud)
问题是,尽管随机总是生成不同的数字,但绘制的结果始终是相同的纹理,它从运行变为另一个运行,但对于所有8个纹理它总是相同的
spriteBatch.Begin();
for (int i = 0; i < DockedFruitsList.Count; i++)
{
spriteBatch.Draw(DockedFruitsList[i].Texture, DockedFruitsList[i].Position, Color.White);
}
spriteBatch.End();
Run Code Online (Sandbox Code Playgroud) 我需要创建一个包含十亿个整数的列表,它们必须都是唯一的.我还需要非常快速地完成这项工作.
创建列表并逐个添加随机数并检查每个列表是否重复是非常慢的.
如果我只是用随机数填充列表而不检查它们是否重复,然后使用distinct().toList(),这似乎相当快.我重复这个,直到没有重复.但是,创建新列表所使用的额外内存不是最佳的.有没有办法获得distinct()的性能,但它只是修改源列表而不是创建一个新的列表?
这是我在List中随机排序第一个N元素的代码:
int upper = 1;
if (myList.Count > 1)
{
Random r = new Random();
upper = Math.Min(maxNumberOfPackets, myList.Count);
for (int i = 0; i < upper; i++)
{
int randInd = r.Next(i, myList.Count);
var temp = myList[i];
myList[i] = myList[randInd];
myList[randInd] = temp;
}
}
Run Code Online (Sandbox Code Playgroud)
好吧,现在我有"必要性"只使用Enumerable(出于某种原因;所以我不想在Enumerable中转换它).
根据您的了解,我可以使用Enumerable进行相同的操作吗?我认为痛苦是在X位置获得元素......
我很好奇......
我有一个长度为100的字符串数组.我希望在C#中没有重复元素的100个元素中随机获得8个元素.请帮我.我很感激.我只是用:
for (int i = 0; i < 8; i++)
{
work with 8 values here
}
Run Code Online (Sandbox Code Playgroud)
上面的代码只执行8个第一个值而不是8个随机值.
你能帮我找一个随机化数组的方法吗?例如:
int[] arrayInt = { 1, 2, 3, 4, 5, 6, 7 };
Run Code Online (Sandbox Code Playgroud)
随机化后,结果应存储在另一个数组中.
当你再次随机化时,它应该与存储在第二个数组中的值进行比较,如果该值存在,程序必须再次随机化.
我正在尝试创建一个 1 到 500 之间不重复的随机数生成器。我创建了一个数组来跟踪生成的数字是否已被使用,但它似乎不起作用
if (drawnTF[num] == false)
{
labels[labelNum].Visible = false;
txtLatestDrawnNum.Text = "Latest Drawn Number: " + latestDrawnNum.ToString("000");
drawnTF[num] = true;
}
else
{
while (drawnTF[num] == true)
{
num = random.Next(0, 499);
if (drawnTF[num] == false)
{
labelNum = 499 - num;
labels[labelNum].Visible = false;
txtLatestDrawnNum.Text = "Latest Drawn Number: " + latestDrawnNum.ToString("000");
drawnTF[num] = true;
}
}
}
Run Code Online (Sandbox Code Playgroud)