小编Eri*_*ert的帖子

为什么在hashCode中使用素数?

我只是想知道为什么在类的hashCode()方法中使用素数?例如,当使用Eclipse生成我的hashCode()方法时,总会使用素数31:

public int hashCode() {
     final int prime = 31;
     //...
}
Run Code Online (Sandbox Code Playgroud)

参考文献:

这是关于Hashcode的一篇很好的入门文章和关于我如何找到哈希工作的文章(C#但概念是可转移的): Eric Lippert的GetHashCode指南和规则()

java primes hashcode

160
推荐指数
4
解决办法
6万
查看次数

如何在.net(c#)中为可安全存储在数据库中的字符串创建HashCode?

引用 Eric Lippert的GetHashCode指南和规则:

规则:GetHashCode的消费者不能依赖它随着时间的推移或跨appdomains的稳定性

假设您有一个Customer对象,其中包含一系列字段,如Name,Address等.如果在两个不同的进程中使用完全相同的数据生成两个这样的对象,则它们不必返回相同的哈希代码.如果你在星期二的一个进程中创建这样一个对象,关闭它,并在星期三再次运行程序,哈希码可能会有所不同.

这在过去曾经被人咬伤过.System.String.GetHashCode的文档特别指出,两个相同的字符串在CLR的不同版本中可以具有不同的哈希码,实际上它们也是如此.不要在数据库中存储字符串哈希并期望它们永远是相同的,因为它们不会.

那么创建一个可以存储在数据库中的字符串的HashCode的正确方法是什么?

(请告诉我,我不是第一个在我写的软件中留下这个错误的人!)

.net c# database hashcode gethashcode

44
推荐指数
2
解决办法
1万
查看次数

C#将List <int>转换为List <double>

我有一个List<int>,我想将其转换为List<double>.有没有办法做到这一点,除了循环List<int>并添加到这样的新List<double>:

List<int> lstInt = new List<int>(new int[] {1,2,3});
List<double> lstDouble = new List<double>(lstInt.Count);//Either Count or Length, I don't remember

for (int i = 0; i < lstInt.Count; i++)
{
    lstDouble.Add(Convert.ToDouble(lstInt[0]));
}
Run Code Online (Sandbox Code Playgroud)

这有什么奇特的方法吗?我正在使用C#4.0,所以答案可能会利用新的语言功能.

c# generics

25
推荐指数
3
解决办法
2万
查看次数

为什么将HashTable的长度设置为素数是一个好习惯?

当我点击这段时,我正在阅读Eric Lippert 关于GetHashCode指南和规则的最新博客帖子:

我们在这里可能更聪明; 就像List在它满了时调整自身大小一样,bucket set也可以自行调整大小,以确保平均bucket长度保持低位.此外,由于技术原因,通常最好将存储桶设置长度设为素数,而不是100.我们可以对此哈希表进行大量改进.但是这个哈希表的简单实现的快速草图现在可以做到.我想保持简单.

所以看起来我错过了一些东西.为什么将它设置为素数是一个好习惯?

c# arrays primes hashcode

24
推荐指数
3
解决办法
8453
查看次数

为什么我没有收到关于未初始化的只读字段的警告?

如果您忘记初始化私有或内部的只读成员,或者声明它的类是内部的,那么C#编译器就足以为您提供"永远不会分配字段"警告.但如果该类是公开的,并且只读成员是公共的,受保护的或内部保护的,那么就没有警告!

有谁知道为什么?

示例代码,用于说明发出警告的条件以及未发出警告的条件:

namespace Test1 
{ 
    class Test1
    { 
#if TRY_IT 
        public readonly int m; //OK: warning CS0649: Field is never assigned to, and will always have its default value 0 
        protected readonly int n; //OK: warning CS0649: Field is never assigned to, and will always have its default value 0 
        internal readonly int o; //OK: warning CS0649: Field is never assigned to, and will always have its default value 0 
        private readonly int p; //OK: warning CS0649: Field is …
Run Code Online (Sandbox Code Playgroud)

c# compiler-construction

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

C#IEnumerable打印出来

我遇到了一个数组的问题,例如我想在列表中打印出奇数.

int[] numbers = new int[]{ 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 };
Console.WriteLine(numbers.Where(n => n % 2 == 1).ToArray());
Run Code Online (Sandbox Code Playgroud)

ToString方法似乎不起作用?我不想循环遍历元素.我能做什么?

c# ienumerable

12
推荐指数
3
解决办法
1万
查看次数

C#覆盖公共成员并将其设为私有

可能?你可以改变访问什么什么别的吗?

.net c# overriding private public

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

在任何地方查找枚举都将转换为字符串

我正在尝试在解决方案中随处找到特定枚举转换为字符串的方法,无论是否显式调用ToString().(这些被替换为使用枚举描述的转换以改进混淆.)

示例:我想找到诸如此类的代码 string str = "Value: " + SomeEnum.someValue;

我已经尝试用包含类的包含类来替换enum本身,包含隐式转换到枚举类型并覆盖包装类中的ToString(),但是当我尝试搜索ToString()覆盖的使用时,它给了我一个位置列表在任何东西上调用ToString()的解决方案(只有在显式调用它的地方).搜索是在Visual Studio中使用ReSharper完成的.

有没有其他方法可以找到这些枚举到字符串的转换?手动完成整个解决方案听起来并不是很有趣.

c# string enums roslyn

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

是否已经内置了这些功能性的C#/ .NET构造?g(h())或

public static Func<V> To<T, V>(this Func<T> g, Func<T, V> h)
{
    return () => h(g());
}

public static Func<T> ToIdentity<T>(this T t)
{
    return () => t;
}
Run Code Online (Sandbox Code Playgroud)

在延迟评估时,我有时会使用这些和其他人.这些已经在.net库中吗?

编辑:

以下是一个示例用法:

public static string SuffixColumn(this string v, string suffix, int columns)
{
    return
    v.ToIdentity()
        .ToScrubbedHtml()
        .ToFormat(() => "{0} " + suffix.ToLower().PadLeft(columns, ' '))
        .ToErrorText(v, suffix, columns)();
}
Run Code Online (Sandbox Code Playgroud)

ToErrorText将'v'检查为合法(非错误代码,非null等),如果好,它运行链接在Func中,如果不好则生成故障安全文本结果.如果v,后缀或列不好,则永远不会调用ToFormat.(因此延迟/未评估的使用).

ToFormat几乎是提供的Func和string.Format的组合.ToIdentity用于将v提升为Func,然后链中的所有内容都基于T的一些Func.

.net c# monads functional-programming

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

如何从表达式树中获取参数名称?

我有这种类型的表达式:

Expression<Action<T>> expression
Run Code Online (Sandbox Code Playgroud)

如何从此表达式中获取参数名称(可选:和值)?

例:

o => o.Method("value1", 2, new Object());
Run Code Online (Sandbox Code Playgroud)

名称可以是str_par1,int_par2,obj_par3

c# expression-trees

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