当前位置:编程学习 > C#/ASP.NET >>

我也show一show工作中用到的几个和LINQ有关的小例子

有一个字符串数组
IEnumerable<string> a;
里面内容
"a1","b1","c1","d1"

要求打印出 a1-b1-c1-d1的效果

用LINQ的Aggregate(),一条语句完成
Console.Write(a.Aggregate((a1,b1)=>a1+"-"+b1));

当然你也可以用string.Join,不过只能是针对string[]的,有些通用性不好 --------------------编程问答-------------------- 还有一个问题,在屏幕上的不同的textBox里面,有不同的字符,用户要求在鼠标点击这些textBox的时候,根据里面text的不同弹出不同的处理窗口,比如

1)如果textBox.Text == "c:\xxx\武藤兰.avi";那么要求弹出一个播放电影的窗口
2)如果textBox.Text == "2009/7/31",那么要求弹出一个修改日期的窗口
3)如果textBox.Text == "中国上海市.普陀区.666弄.225号",那么弹出一个修改地址的窗口
等等

而且用户的要求会经常曾加、修改,怎样设计一个灵活的结构来解决这个问题,使得每次用户的要求变化的时候不至于使得程序员工作量很大呢?

本人想出了一个绝妙的方法,稍后给出答案
--------------------编程问答-------------------- 首先,设计一个 List<> theRule,如下:

List<KeyValuePair<
            Func<string, bool>, 
            Func<string,string>>
            > theRule

第一个Func<string, bool>用来帮助用户判断所输入的字符串是不是符合某种定义,拿我的第一个例子作示范。用户的要求是:如果字符串里面是一个在本地硬盘中的.avi文件,比如"c:\xxx\武藤兰.avi",那么就返回True值。

否则,比如这个,"http:\\www.xxx.com\武藤兰.avi" 虽然也是兰兰的作品,但是因为在互联网络上,而不是在本地硬盘上,所以不能符合用户条件,应该返回false值

第二个Func<string,string>很简单了,就是一个输入为string,输出为string的函数,这个函数用于用户在通过某种程序修改了字符串后把新的字符串值赋给所选择的textBox.Text

比如第二个用户条件,当textBox.Text == "2009/7/31",那么要求弹出一个修改日期的窗口,然后把修改后的日期值再赋给textBox.Text

这是基本的一个List<>架构,接下来该给它赋值了,如下:

void InitRules()
{
    List<KeyValuePair<
            Func<string, bool>, 
            Func<string,string>>
            > theRule = new List<KeyValuePair<Func<string, bool>, Func<string,string>>>();

    // play the avi
    theRule.Add(
                new KeyValuePair<Func<string, bool>, Func<string,string>>(
                    s => File.Exist(s) && s.EndWith(".avi"),
                    s => { Play(s); return s; })
                    );

   theRule.Add(
                new KeyValuePair<Func<string, bool>, Func<string,string>>(
                    s => IsValidDate(s),
                    s => ModifyDate(s))
                    );      
}


接下来就是怎么使用这个 theRule 了

太晚了,明天再说


--------------------编程问答-------------------- LZ的共享精神赞一个 --------------------编程问答-------------------- 继续:

List<>结构搭好了,现在给出应用这个结构的代码:

void UseIt(TextBox textBox)
{
     string theInputValue = textBox.Text;
     if (theRule.Any(s => s.Key(theInputValue)))
     {
         textBox.Text = theRule.Single(s => s.Key(theInputValue)).Value(theInputValue);
     }
}

是不是很爽很简达啊,下次如果用户在来一个新的要求,那么哦我们只要再增加一条这样的语句就好

theRule.Add( 
                new KeyValuePair <Func <string, bool>, Func <string,string>>( 
                    s => IsValid(s), 
                    s => ToModify(s)) 
                    );      

而在应用端的代码则不用改变

明天在继续贴其他的LINQ应用

希望高手给一点建议啊?不要光看不说,多谢多谢 --------------------编程问答-------------------- 精神值得鼓励和表扬 --------------------编程问答-------------------- 各位老大,提一点意见吗!我这种解决方法是画蛇添足还是锦囊妙计?我也是刚刚开始学LINQ,鼓励很感谢,但是还是乞求一点意见和怎样改进程序的方法

sp123 吴老大,您也出来说句话啊

^_^ --------------------编程问答-------------------- 很好。。。 --------------------编程问答-------------------- 不错~~~· --------------------编程问答-------------------- 1)如果textBox.Text == "c:\xxx\武藤兰.avi";那么要求弹出一个播放电影的窗口 


汗………………………… --------------------编程问答-------------------- lz老大真太好了
补充:.NET技术 ,  LINQ
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,