新足迹

 找回密码
 注册

精华好帖回顾

· 猎梦人谈交易系统 (2009-12-31) 猎梦人 · . (2020-5-8) 南瓜地
· 2012的最后几张无聊杂图 和 一点碎碎念 (2012-12-28) JerryWu · 新足迹读书半月谈 2009年6月下 —— 巴尔扎克 (2009-6-15) joaquin
Advertisement
Advertisement
12
返回列表 发新帖
楼主:hornsay

[IT] 请教C# 高手之三: 寻找key value pair list object [复制链接]

发表于 2010-6-11 13:29 |显示全部楼层

回复 29# 的帖子

此文章由 hornsay 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 hornsay 所有!转贴必须注明作者、出处和本声明,并保持内容完整
OK. 有一个key list, either load from configuration file at runtime or added during design time.

然后程序要按这个key list 来做validation, 如果相对应的key 没有value, 程序要respond error message. 如果有value, 就把value assign 到相对应的key 的位置上。

这样的key/value pair list 得到后, 我会pass 到后面的data module 中去做个query, 然后得到一个datatable,

拿到datatable后再以xml 的data 形式return 给requestor.

这就是我这个小的asp.net的构思。
持不同股见者...
Advertisement
Advertisement

发表于 2010-6-11 13:33 |显示全部楼层

回复 30# 的帖子

此文章由 hornsay 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 hornsay 所有!转贴必须注明作者、出处和本声明,并保持内容完整
但如何解决少了一个request参数, 你必须要有一个key list作为一个参考的标准。

发表于 2010-6-11 13:49 |显示全部楼层

回复 32# 的帖子

此文章由 蓝爸爸 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 蓝爸爸 所有!转贴必须注明作者、出处和本声明,并保持内容完整
初始化Key Hash,把所有期望的Key加进去,初始value全为“”。
读入一个参数。
在Key Hash用Contains检查此参数是否在Key Hash里面 if (key_hash.Contains(param_name))
如果在,取得value;如果不在,不期望的参数,怎么处置随你。
如果value不是“”,说明是重复参数;否则,给此Key赋值 key_hash[param_name] = param_value。

其实用""检查是否重复赋值不可靠。我们的项目里面,value本身是一个struct,里面有一个标记用来标识是否赋过值(这样的话,重复参数也用这个做检查)。

最后,把key_hash foreach一下,如果有某个Key的value是“”(或者用我的struct的方法), 少参数,error response。

发表于 2010-6-11 13:55 |显示全部楼层
此文章由 hornsay 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 hornsay 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 蓝爸爸 于 2010-6-11 12:49 发表
初始化Key Hash,把所有期望的Key加进去,初始value全为“”。
读入一个参数。
在Key Hash用Contains检查此参数是否在Key Hash里面 if (key_hash.Contains(param_name))
如果在,取得value;如果不在,不期望的参 ...


但是key hash后是不是又回到了次序问题?hashtable 会自动sort key.
持不同股见者...

发表于 2010-6-11 14:00 |显示全部楼层

回复 33# 的帖子

此文章由 hornsay 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 hornsay 所有!转贴必须注明作者、出处和本声明,并保持内容完整
我觉得还是要用key list 来做loop validation, 而不是用request 来loop.

发表于 2010-6-11 14:06 |显示全部楼层
此文章由 乱码 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 乱码 所有!转贴必须注明作者、出处和本声明,并保持内容完整
在作key insertion的时候,就作validation,通不过的不加进去。这样保证全部的key/value都是valid的。
Advertisement
Advertisement

发表于 2010-6-11 14:38 |显示全部楼层
此文章由 中间人 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 中间人 所有!转贴必须注明作者、出处和本声明,并保持内容完整
d.values[sKey] = sValue; //can't complied

d[sKey] = sValue;

楼主的基本语法都欠缺啊。

发表于 2010-6-11 14:40 |显示全部楼层
此文章由 蓝爸爸 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 蓝爸爸 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 hornsay 于 2010-6-11 12:55 发表


但是key hash后是不是又回到了次序问题?hashtable 会自动sort key.


因为你引用的时候都是用的key_hash[key]这样的方式,根本不会用到次序的。我左思右想,可能唯一让LZ不爽的是:在Request里面可能是b参数在a参数前面,如果缺a和b参数,LZ的意思是要报“parameter b missed", 而不是”parameter a missed",不知道LZ是不是有这个要求?

发表于 2010-6-11 14:48 |显示全部楼层
此文章由 中间人 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 中间人 所有!转贴必须注明作者、出处和本声明,并保持内容完整
如果31楼是需求,那么
            HashSet<string> keys = new HashSet<string>(); // 这个keys可以是静态的,你要自己初始化它。
            foreach (string key in keys)
            {
                if (string.IsNullOrEmpty(Request[key]))
                {
                    //todo
                }
            }

当然你需要构造一个数据层接受的数据结构

[ 本帖最后由 中间人 于 2010-6-11 13:49 编辑 ]

发表于 2010-6-11 14:53 |显示全部楼层
此文章由 hornsay 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 hornsay 所有!转贴必须注明作者、出处和本声明,并保持内容完整
我把Delphi里的做法post一下, 非常简单:

function ValidateRequest(KeyValueList, RequestList : TStrings) : string;
var
  i : integer;
  sKey, sValue : string;
begin
  Result := '';
  for i := 0 to keyValueList.Count - 1 do
  begin
     sKey := KeyValueList.Names [ i ];
     if RequestList.IndexofName(sKey) >= 0 then
     begin
       sValue :=  
RequestList.Values[sKey];
       if sValue = '' then
       begin
          Result := 'Missing parameter: '+sKey+ ' value';
          break;
       end;
       KeyValueList.Values[sKey] := sValue;
     end
     else
     begin
          Result := 'Missing parameter: '+sKey;
          break;
     end;
  end;
end;


[ 本帖最后由 hornsay 于 2010-6-11 13:59 编辑 ]
持不同股见者...

发表于 2010-6-11 15:01 |显示全部楼层
此文章由 中间人 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 中间人 所有!转贴必须注明作者、出处和本声明,并保持内容完整
40楼的函数,我改成C#的话,首先返回bool而不是string,当然需要result string的话,放out参数里,还要一个out参数传出得到的key/value pairs.

更完备的做法是建一个ValidationResult基类,有bool Result 和 string Message。所有Validation函数都返回这个基类或者是个接口。
Advertisement
Advertisement

发表于 2010-6-11 15:04 |显示全部楼层

回复 38# 的帖子

此文章由 hornsay 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 hornsay 所有!转贴必须注明作者、出处和本声明,并保持内容完整
等我回电脑公司后按你的方法作一下。

发表于 2010-6-11 15:08 |显示全部楼层

回复 41# 的帖子

此文章由 hornsay 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 hornsay 所有!转贴必须注明作者、出处和本声明,并保持内容完整
做个ValidationResult基类就更漂亮了,我现在只是想如何能把Delphi里的基本做法移植到C#里。

发表于 2010-6-11 15:22 |显示全部楼层

回复 43# 的帖子

此文章由 flyspirit 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 flyspirit 所有!转贴必须注明作者、出处和本声明,并保持内容完整
不是已经给了你很简洁的方案了吗?

发表于 2010-6-11 15:24 |显示全部楼层
此文章由 cdfei 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 cdfei 所有!转贴必须注明作者、出处和本声明,并保持内容完整
专家主要是在C#中找和DELPHI相似的东西。

发表于 2010-6-11 15:29 |显示全部楼层

回复 45# 的帖子

此文章由 flyspirit 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 flyspirit 所有!转贴必须注明作者、出处和本声明,并保持内容完整
那很无聊
Advertisement
Advertisement

发表于 2010-6-11 15:30 |显示全部楼层
此文章由 hornsay 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 hornsay 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 cdfei 于 2010-6-11 14:24 发表
专家主要是在C#中找和DELPHI相似的东西。


就目前来说是这样,因为我对C#很不熟,还不能灵活应用个类object.
持不同股见者...

发表于 2010-6-11 15:33 |显示全部楼层
此文章由 hornsay 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 hornsay 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 flyspirit 于 2010-6-11 14:22 发表
不是已经给了你很简洁的方案了吗?


谢谢拉,我会去体会一下你的方案。就目前来看你的方案是最易懂的。
持不同股见者...

发表于 2010-6-11 15:42 |显示全部楼层

回复 48# 的帖子

此文章由 flyspirit 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 flyspirit 所有!转贴必须注明作者、出处和本声明,并保持内容完整
尽量不要去想Delphi里面应该怎么做,会影响学新语言的效果。

好比方你找了个新女朋友,就别老想以前的女朋友怎么怎么体贴了。

发表于 2010-6-11 15:49 |显示全部楼层
此文章由 hornsay 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 hornsay 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 flyspirit 于 2010-6-11 14:42 发表
尽量不要去想Delphi里面应该怎么做,会影响学新语言的效果。

好比方你找了个新女朋友,就别老想以前的女朋友怎么怎么体贴了。

我找到新女朋友, 马上把以前的女朋友给忘了。
持不同股见者...

发表于 2010-6-11 15:49 |显示全部楼层
此文章由 中间人 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 中间人 所有!转贴必须注明作者、出处和本声明,并保持内容完整
看了一下22楼的code,
1,用hashset instead of List<string>,效率考虑
2,Request[key] instead of Request.QueryString.Get(key),这里有较大区别。QueryString真的只在url里找,但万一数据在form里呢?
Advertisement
Advertisement

发表于 2010-6-11 15:52 |显示全部楼层
此文章由 cdfei 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 cdfei 所有!转贴必须注明作者、出处和本声明,并保持内容完整
还好吧,呵呵


原帖由 flyspirit 于 2010-6-11 14:29 发表
那很无聊

发表于 2010-6-11 15:54 |显示全部楼层
此文章由 cdfei 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 cdfei 所有!转贴必须注明作者、出处和本声明,并保持内容完整
不是吧,应该是我的方法最适合DELPHI开发者

原帖由 hornsay 于 2010-6-11 14:33 发表


谢谢拉,我会去体会一下你的方案。就目前来看你的方案是最易懂的。

发表于 2010-6-11 16:01 |显示全部楼层
此文章由 flyspirit 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 flyspirit 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 中间人 于 2010-6-11 14:49 发表
看了一下22楼的code,
1,用hashset instead of List,效率考虑
2,Request[key] instead of Request.QueryString.Get(key),这里有较大区别。QueryString真的只在url里找,但万一数据在form里呢?


楼主预定义要Check的key只有5个,用HashSet也可以,但对效率影响可忽略不计

要看LZ的需求了,要不要考虑Form里面的字段。同样根据预定义key,没有一个会在Form里面的。

发表于 2010-6-11 16:13 |显示全部楼层
此文章由 hornsay 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 hornsay 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 cdfei 于 2010-6-11 14:54 发表
不是吧,应该是我的方法最适合DELPHI开发者



我也会试一下你的方案。

在这里我要感谢各位给与我的帮助,你们的点子加快了我对C#的认识. 再次感谢大家.
持不同股见者...

发表于 2010-6-11 16:15 |显示全部楼层
此文章由 cdfei 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 cdfei 所有!转贴必须注明作者、出处和本声明,并保持内容完整
我也是delphi出身,不过现在忘的差不多了。。。。
Advertisement
Advertisement

发表于 2010-6-11 16:29 |显示全部楼层

回复 56# 的帖子

此文章由 hornsay 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 hornsay 所有!转贴必须注明作者、出处和本声明,并保持内容完整
还是你转业转的快啊.

发表于 2010-6-11 16:50 |显示全部楼层
此文章由 flyspirit 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 flyspirit 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 hornsay 于 2010-6-11 14:49 发表

我找到新女朋友, 马上把以前的女朋友给忘了。


这是个好习惯

发表回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Advertisement
Advertisement
返回顶部