大家一起来找碴,这两个结构体,有什么不多。

微创社(MCC) 2009-08-24 12:43:15
各种方面的,角度越独特越好。

struct StructA
{
public string s;
public int i;
}

struct StructB
{
public int i;
public string s;
}


[1]结构名不一样,
[2]字段顺序不一样

还会产生哪些重要大差别~~
...全文
455 61 打赏 收藏 转发到动态 举报
写回复
用AI写文章
61 条回复
切换为时间正序
请发表友善的回复…
发表回复
微创社(MCC) 2009-09-02
  • 打赏
  • 举报
回复
问题己结,具体内容详见:
http://topic.csdn.net/u/20090825/16/725bc96a-33f9-4c63-85ef-01d22d6c1ed2_3.html

211楼、213楼、229楼、230楼、236楼、239楼、247楼、253楼、257楼、258楼。
微创社(MCC) 2009-08-27
  • 打赏
  • 举报
回复
满三了,帮个忙~~
http://topic.csdn.net/u/20090825/16/725bc96a-33f9-4c63-85ef-01d22d6c1ed2.html?seed=34499191&r=59362105#r_59362105

临时寄存一下:

using System;
using System.Collections;
public class List
{
public static IEnumerator Power(int number, int exponent)
{
int counter = 0;
int result = 1;
while (counter++ < exponent)
{
result = result * number;
yield return result;
}
}

static void Main()
{
IEnumerator ie = Power(2, 8);
Console.WriteLine(ie.GetType().ToString());

//ie.Reset();
while (ie.MoveNext())
{
Console.Write("{0} ", ie.Current);
}

Console.ReadKey();
}
}

hangang7403 2009-08-27
  • 打赏
  • 举报
回复
学习了,不错,楼主很用心
微创社(MCC) 2009-08-27
  • 打赏
  • 举报
回复
[Quote=引用 56 楼 pcnetman888 的回复:]
引用 55 楼 junyao100 的回复:
无区别……


区别在37楼,
红色标注的那句话...

[/Quote]

你没有理解到设计HashCode的真正含义:
HashCode可以看作Equals的辅助,
就是:利用HashCode函数来做预判,来减少Equals的调用次数.
HashCode函数至少要求是"合理的",
"合理的"的含义是能够识别出被比较对象的"逻辑"不等关系.
上面代码的例子中,不等关系不是原"字符串"不等,而是"字符组合后不重复"不等.

public int GetHashCode(string x)
{
countGetHashCode++;
int hashcode = 0;

//return countGetHashCode;//测试countGetHashCode全不冲突时,Equals的依赖情况
//return 0x7FFFFFFF;//测试countGetHashCode全冲突时,Equals的依赖情况

char[] charArrX = x.ToCharArray();
Array.Sort(charArrX);

int count = charArrX.Count();
for (int i = 0; i < count; i++)
{
hashcode ^= ((int)charArrX[i]) << (count - i - 1);
}

return hashcode & 0x7FFFFFFF;
}


这段代码,是产生一个尽可能的"逻辑"关系的散列,
虽然不可能做到一对一的关系,(数组大到16的16次方时)
这个效率还是挺高的,在100万时,重码率也不到1%,
在2000~5000之间基本上是一个重码.
RexZheng 2009-08-27
  • 打赏
  • 举报
回复
[Quote=引用 53 楼 pcnetman888 的回复:]
引用 48 楼 0009 的回复:
不过我大概看了楼主做那种题目用的是HashCode,这显然是不行的,因为int32的范围表达不了那么多种组合,这样在大范围计算中会有很大的误差。




hashcode关没有要求一对一,也不可能,只是尽量散列,
否则基本上没有多上对象能实现这个了.
[/Quote]

是啊,HashCode 的设计原则不是一对一,正因为如此,才说你用HashCode出解答那道题肯定会有误差。
微创社(MCC) 2009-08-27
  • 打赏
  • 举报
回复
[Quote=引用 55 楼 junyao100 的回复:]
无区别……
[/Quote]

区别在37楼,
红色标注的那句话...
junyao100 2009-08-27
  • 打赏
  • 举报
回复
无区别……
Java_And_NET 2009-08-27
  • 打赏
  • 举报
回复
顶!
RexZheng 2009-08-26
  • 打赏
  • 举报
回复
不过我大概看了楼主做那种题目用的是HashCode,这显然是不行的,因为int32的范围表达不了那么多种组合,这样在大范围计算中会有很大的误差。

RexZheng 2009-08-26
  • 打赏
  • 举报
回复
[Quote=引用 41 楼 pcnetman888 的回复:]
GetHashCode确实能够短路掉Equals,
但是Equals还是被调用了,
难道编译器做了手脚。
[/Quote]

没听明白你什么意思。
hecker728 2009-08-26
  • 打赏
  • 举报
回复
一样的
qinying_cc 2009-08-26
  • 打赏
  • 举报
回复
我们群讨论过这个问题20235451
stning 2009-08-26
  • 打赏
  • 举报
回复
楼主,你可以看看这个函数RuntimeHelpers.GetHashCode()
微创社(MCC) 2009-08-26
  • 打赏
  • 举报
回复
[Quote=引用 48 楼 0009 的回复:]
不过我大概看了楼主做那种题目用的是HashCode,这显然是不行的,因为int32的范围表达不了那么多种组合,这样在大范围计算中会有很大的误差。


[/Quote]

hashcode关没有要求一对一,也不可能,只是尽量散列,
否则基本上没有多上对象能实现这个了.
angel6709 2009-08-26
  • 打赏
  • 举报
回复
不知道
随风落梦 2009-08-26
  • 打赏
  • 举报
回复
初始化顺序肯定不同,因此内存中存放的位置也不同了!其他区别的话就是一个结构在上面一个在下面
mbh0210 2009-08-26
  • 打赏
  • 举报
回复
好帖子,除了在堆栈的顺序不一样以外,顺序不一样,分配的内存空间一就不一样,其他的还真没想出来
灵雨飘零 2009-08-26
  • 打赏
  • 举报
回复
帮顶。。。。。。。
微创社(MCC) 2009-08-25
  • 打赏
  • 举报
回复
对hashcode实现原理感兴趣的,可以看一下:
http://topic.csdn.net/u/20090823/21/032c6587-ff8a-4d97-858f-73b752b6ca22.html
其中的第62楼和63楼(代码太长,一个回贴发不了)

有一个问题实在想不通。

GetHashCode确实能够短路掉Equals,
但是Equals还是被调用了,
难道编译器做了手脚。

请求支援,查不到次料,请坛子里的高手帮个忙.~~~
微创社(MCC) 2009-08-25
  • 打赏
  • 举报
回复
[Quote=引用 38 楼 liffe 的回复:]
初始化顺序不一样,但都是在进程堆栈中分配空间
[/Quote]

本问题的关键在于:
次序的改变,会直接影响到程序的运行效率,
当然这个还要取决于代码的使用场景.
见37楼的红色标注部分.

通过几乎没有代价的顺序调整,
提升程序的效率(即便是很小,但有时也会)
这种影响还算是"重要"的吧.
加载更多回复(39)

110,539

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧