小编Chi*_*ata的帖子

随机对象随后的调用变得非随机?

可能重复:
随机数生成器仅生成一个随机数

我的工作中有一个方法,它通过在一组单词之间随机选择产生一个句子,如下所示:

private string generateTest(string test)
{
    test = test.ToLower();
    string sentence = "";
    for (int c = 0; c < 30; c++)
    {
        Random r = new Random();
        int len = r.Next(3, 7);
        string word = "";
        for (int i = 0; i < len; i++)
        {
            word += test[r.Next(0, test.Length)];
        }
        sentence += word + ' ';
    }
    return sentence;
}
Run Code Online (Sandbox Code Playgroud)

然而,问题在于,在随机生成前6个单词之后,所有后续代都完全相同.例如

aqaaaz,qqzaq,aqqza,azqq,aazzq,aqqa,azzzq,azzzq,azzzq,azzzq,azzzq,azzzq,azzzq,azzzq,azzzq,azzzq,azzzq,azzzq,azzzq,azzzq,azzzq,azzzq,azzzq,azzzq,azzzq. ...

然后,即使我重新启动程序,同样的事情也适用.我在想这是.NET Runtime做一些自动优化.谁能解释得更好?我该如何解决这个问题?

c# memory optimization

1
推荐指数
1
解决办法
82
查看次数

两个包含相同元素的数组可以不相等吗?

今天我遇到了一个惊人的问题,我试图找到一个对象是否包含在List集合中.问题是列表找不到对象,并且当我可以在那里看到它时将index返回-1.然后我创建了一个自定义索引查找器,通过比较属性而不是直接相等来查找对象,我发现对象的一个​​属性,一个相同的ushort数组在比较时返回false,但它们包含完全相同的元素.

数组如下:

{ushort [1]} [0] 13

它们两者完全相同,只是其中一个对象包含在List中,而另一个对象在它自己的上面.可能是造成这个问题的原因是什么?我已经尝试了所有类型的不同方法来解决问题,但我不能弄清楚问题是什么.在这种特殊情况下,导致两个数组之间的比较返回false的原因是,我使用Object.equals和普通==比较器一样使用.谢谢

c# arrays list c#-4.0

1
推荐指数
1
解决办法
748
查看次数

C#非矩形按钮

我试图想出一种在C#中的Windows窗体中制作非矩形按钮的方法.我一直在寻找这个,并且有很多教程(包括微软自己的文档)关于如何使按钮外观非矩形,但是 - 这很关键 - 它们都没有做任何关于制作按钮的活动区域的事情非矩形.例如,如果您创建一个椭圆形按钮,则边界矩形的角仍然是用于拾取鼠标事件(如翻转和点击)的内容.这对我的需求是不可接受的.我需要在彼此相邻的地方放置几个奇形状的按钮,它们的边界可能会重叠,但它们只应对按钮图形可见部分内的点击做出响应.我已经看到了其他几种语言(主要是Objective-C)的几个问题,但C#没有.Winforms甚至可以实现这一点吗?

c# winapi button winforms

1
推荐指数
1
解决办法
1246
查看次数

如何将Enumerable转换为字典?

我从MSDN示例中获得以下代码:

if (sheetData.Elements<Row>().Where(r => r.RowIndex == rowIndex).Count() != 0)
{
    row = sheetData.Elements<Row>().Where(r => r.RowIndex == rowIndex).First();
...
Run Code Online (Sandbox Code Playgroud)

我重构如下:

Dictionary<uint, Row> rowDic = sheetData.Elements<Row>().ToDictionary(r => r.RowIndex.Value);
if (rowDic[rowIndex].Count() != 0)
{
    row = rowDic[rowIndex];
...
Run Code Online (Sandbox Code Playgroud)

现在,我感觉如果Enumerable.ToDictionary <>方法实际上必须枚举所有数据,那么这也是多余的,但MSDN文档没有说明如何进行这种转换.

我正在考虑使用的替代方案是:

var foundRow = sheetData.Elements<Row>().Where(r => r.RowIndex == rowIndex);
if (foundRow.Count() != 0)
{
    row = foundRow.First();
...
Run Code Online (Sandbox Code Playgroud)

但是,我想知道以前的经验可能更快,为什么.

谢谢.

.net c# linq enumerable

0
推荐指数
1
解决办法
107
查看次数

标签 统计

c# ×4

.net ×1

arrays ×1

button ×1

c#-4.0 ×1

enumerable ×1

linq ×1

list ×1

memory ×1

optimization ×1

winapi ×1

winforms ×1