急死我了,代码拿出来就可以,放进去就不行,真没辙了

梦里开天 2010-03-19 12:15:00

大家帮帮忙看看
byte[] nclientid = new byte[2];
nclientid[0] = 0x01;
nclientid[1] = 0x00;
if (hashclientid.ContainsValue(nclientid))//这里总是不成啊怎么能不为真呢?????
{
System.Console.WriteLine("hit to exit"); ;
}
单独拿出来 就可以啊
...全文
299 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
anlianganl 2010-03-19
  • 打赏
  • 举报
回复
帮你顶!!!
csdnfan 2010-03-19
  • 打赏
  • 举报
回复
你这个if (hashclientid.ContainsValue(nclientid))中的nclientid不是值
你这个hashclientid是什么类型?ContainsValue是Hashtable中的方法...
都不把代码贴出来。。。
xingyuebuyu 2010-03-19
  • 打赏
  • 举报
回复
            lock (hashclientid.SyncRoot)
{
if (hashclientid.ContainsValue(nclientid))//这里总是不成啊怎么能不为真呢?????
{
System.Console.WriteLine("hit to exit"); ;
}
}


这个可能是多线程访问hashclientid引起的,你需要进行同步。
cykevin 2010-03-19
  • 打赏
  • 举报
回复
做个转换吧
ContainsValue((object)nclientid)
li45214521 2010-03-19
  • 打赏
  • 举报
回复
比较不对 需要自己定义比较接口
梦里开天 2010-03-19
  • 打赏
  • 举报
回复
找到问题所在了
byte[] nclientid = new byte[2];
nclientid[0] = 0x01;
nclientid[1] = 0x00;
hashclientid.ContainsValue(nclientid))
这事先new纷飞空间在比 自然就想等了
byte[] nclientid1 = new byte[2];
nclientid1[0] = 0x01;
nclientid1[1] = 0x00;
hashclientid.Add(client, nclientid1);
byte[] nclientid2 = new byte[2];
nclientid2[0] = 0x01;
nclientid2[1] = 0x00;
hashclientid.ContainsValue(nclientid2))//如此就不可了 地址变了
哈哈 对不起大家
我这例子举得不好 数组吗 传得是首地址
孤剑 2010-03-19
  • 打赏
  • 举报
回复
Hashtable 只是比较值是否相等,即 相等性 。
类型的相等是通过类型的 Equals 或 == 操作符 决定的。
对于 byte 类型,在dotnet 中是基础类型,比较时,是比较值,而不是引用地址。
而对于 byte[] 类型,已经不再是值类型了,是 Array 类,是引用类型,因此比较引用地址


Hashtable hashclientid = new Hashtable();//

#region byte[] 继承于 Array 是引用类型
byte[] nclientid = new byte[2];
nclientid[0] = 0x01;
nclientid[1] = 0x00;

byte[] nclientid2 = new byte[2];
nclientid2[0] = 0x01;
nclientid2[1] = 0x00;
#endregion

#region 值类型 byte
// byte nclientid = 0x01;
// byte nclientid2 = 0x01;
#endregion

hashclientid.Add("1", nclientid2);

if (hashclientid.ContainsValue(nclientid))//这里总是不成啊怎么能不为真呢?????
{
System.Console.WriteLine("hit to exit"); ;
}

xingyuebuyu 2010-03-19
  • 打赏
  • 举报
回复
            Hashtable hashclientid = new Hashtable();//激活事件记录
byte[] bTID1 = new byte[2]; ;//四位终端编号
a: bTID1[0] = 0x01;
bTID1[1] = 0x00;
byte[] bTID2 = new byte[2]; ;//四位终端编号
b: bTID2[0] = 0x01;
bTID2[1] = 0x00;
if (!hashclientid.ContainsValue(bTID1))
{
hashclientid.Add(client, bTID1);

}
if (hashclientid.ContainsValue(bTID2)) goto b;


你举得例子不对,ContainsValue比较的是引用地址,因为bTID1和bTID2 中的值虽然是想等的,但是引用地址不相同,所以ContainsValue会返回false
梦里开天 2010-03-19
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 qldsrx 的回复:]
单独拿出来的话,同一个nclientid自然可以,他们的引用地址相同,但是你重新new一个byte[2]给nclientid后,就算里面添加的两个元素都相同,也不是同一个对象了,比较的是他们的内存地址,而不是里面的两个元素。
[/Quote]
我也觉着是这样
可是单独
Hashtable hashclientid = new Hashtable();//激活事件记录
byte[] bTID1 = new byte[2]; ;//四位终端编号
a: bTID1[0] = 0x01;
bTID1[1] = 0x00;
if (!hashclientid.ContainsValue(bTID1))
{
hashclientid.Add(client, bTID1);

}
if (hashclientid.ContainsValue(bTID1)) goto a;
}
}
}
你可以试试
qldsrx 2010-03-19
  • 打赏
  • 举报
回复
单独拿出来的话,同一个nclientid自然可以,他们的引用地址相同,但是你重新new一个byte[2]给nclientid后,就算里面添加的两个元素都相同,也不是同一个对象了,比较的是他们的内存地址,而不是里面的两个元素。
验证码识别 2010-03-19
  • 打赏
  • 举报
回复
好诡异

梦里开天 2010-03-19
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 qldsrx 的回复:]
Hashtable的Key不要用Socket类的对象,那样会导致Socket无法正常释放的。你要查找的Value是引用类型的值,数组本身就是引用类型的,所以无法直接查找,需要内部元素逐个比较,引用类型只存放了引用地址,你应该好好学习下值类型和引用类型的区别。
[/Quote]
那为什么单独把代码拿出来可以啊 不明白
对ContainsValue理解不够啊 现在是用值比较了
谢谢大家
梦里开天 2010-03-19
  • 打赏
  • 举报
回复
lock (hashclientid)
{
foreach (Object value in hashclientid.Values)
{
if(nclientid[0]==((byte[])value)[0]&&nclientid[1]==((byte[])value)[1])
{
System.Console.WriteLine("hit to exit"); ;
}
}
}
只能这样做了 应该效率是一样的 只不过工作自己做了
qldsrx 2010-03-19
  • 打赏
  • 举报
回复
Hashtable的Key不要用Socket类的对象,那样会导致Socket无法正常释放的。你要查找的Value是引用类型的值,数组本身就是引用类型的,所以无法直接查找,需要内部元素逐个比较,引用类型只存放了引用地址,你应该好好学习下值类型和引用类型的区别。
mayonglong 2010-03-19
  • 打赏
  • 举报
回复
应该是类型的原因吧
梦里开天 2010-03-19
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 flower_gf 的回复:]
nclientid是个数组 ContainsValue是比较的value 所以不行
[/Quote]
namespace hashtabletest
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

private void button1_Click(object sender, EventArgs e)
{
//获取服务器IP
string hostName = Dns.GetHostName();
IPAddress[] ip = Dns.GetHostAddresses(hostName);
IPAddress HostIp = ip[0];

//创建一个网络端点
IPEndPoint iep = new IPEndPoint(HostIp, 82);

//创建服务端服务端套接字
Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

Hashtable hashclientid = new Hashtable();//激活事件记录
byte[] bTID1 = new byte[2]; ;//四位终端编号
a: bTID1[0] = 0x01;
bTID1[1] = 0x00;
if (!hashclientid.ContainsValue(bTID1))
{
hashclientid.Add(client, bTID1);

}
if (hashclientid.ContainsValue(bTID1)) goto a;
}
}
}
这样是没问题的啊?
Flower_GF 2010-03-19
  • 打赏
  • 举报
回复
nclientid是个数组 ContainsValue是比较的value 所以不行
梦里开天 2010-03-19
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 menglingjun 的回复:]
if (hashclientid.ContainsValue(nclientid))
你拿一个hashTable去找一个数组。。这本身就不对啊。。
这里应该是
if (hashclientid.ContainsValue(nclientid[0])||hashclientid.ContainsValue(nclientid[1])) 才对吧。。
[/Quote]
同样的代码,单独拿出来就行 hashtable存二维数组可以啊 并且每个value都是一个二维数组啊
你这样比较就说不清楚了啊
梦里开天 2010-03-19
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 xingyuebuyu 的回复:]
C# code
lock (hashclientid.SyncRoot)
{
if (hashclientid.ContainsValue(nclientid))//这里总是不成啊怎么能不为真呢?????
{
System.Console……
[/Quote]
不行啊
menglingjun 2010-03-19
  • 打赏
  • 举报
回复
if (hashclientid.ContainsValue(nclientid))
你拿一个hashTable去找一个数组。。这本身就不对啊。。
这里应该是
if (hashclientid.ContainsValue(nclientid[0])||hashclientid.ContainsValue(nclientid[1])) 才对吧。。

110,560

社区成员

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

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

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