日期:2014-05-17  浏览次数:20693 次

问一个关于Linq的小问题.(select not like)
本帖最后由 diaodiaop 于 2013-11-14 13:30:59 编辑
我有一个全局的集合

static Dictionary<string, Socket> ClientList = new Dictionary<string, Socket>();

每次有客户端连接 我都会用ip:port当作key 当前连接当作value

var client= ar.AsyncState as Socket;
var ipport = client.RemoteEndPoint.ToString();
ClientList.Add(ipport, client);

但是现在有个需求,就是一个IP只能连接一次.新连接的如果跟前面的IP有一样的,那么删除原来的key

保证ClientList里面的IP都不同.

实际上 我用for循环判断可以移除,但是这个ClientList会很大很大,几万几十万几百万.

所以求一个Linq语句找到IP一样的删除之后在添加新的..

比如

var ip=1;
var port=2;
var new=ClientList.select("key not like " +ip+"%");
new.add(ip+":"+port,client);
Client=new;

我是瞎写的 差不多这个意思..

------解决方案--------------------

        private void InsertNewIP(string sIp, string sPort, Socket newSocket)
        {
            string sFindKey = ClientList.Keys.Where(x => x.Substring(0, x.IndexOf(':')) == sIp).SingleOrDefault();
            if (sFindKey == null)
            {
                ClientList.Add(sIp + ":" + sPort, newSocket);
            }
            else
            {
                ClientList.Remove(sFindKey);
                ClientList.Add(sIp + ":" + sPort, newSocket);
            }
        }