IEnumberable<String> To String

如何根据关键字在List<T>中查询出来相应的结果?

Code:

  • Create List<T>

        public class A {
            public string a { get; set; }
            public string b { get; set; }
        }

 

        List<A> aList = new List<A> {
            new A{ a="6", b="AAA"},
            new A{ a="2", b="BBB"}
        };

  • Search List<T>

      //这样是有问题的,无法隐式从IEnumerable<String>转换String

      String c = aList.Where ( o => o.a.Equals ( "6" ) )
                     .Select(o=>o.b);

image

   //这样是没有问题的,但是返回值不对,是当前类型名

     String c = aList.Where ( o => o.a.Equals ( "6" ) )
                      .Select(o=>o.b).ToString();

 

  • 那如何解决?

    使用FirstOrDefault()

    String c = aList.Where ( o => o.a.Equals ( "6" ) )
                            .FirstOrDefault ().b;

     OK了,但是好像有点问题,什么问题呢?

     如果这个集合没有我查询的值,肯定会报错的。

      String c = aList.Where ( o => o.a.Equals ( "1" ) )
                            .FirstOrDefault ().b;

image

  • 那又如何解决呢?

        有两种方案 

  • 编写自定义方法

  String d = Get ( aList , "1" );

        private string Get (List<A> aList , String whereStr) {
           var es = aList.Where ( o => o.a.Equals ( whereStr ) ).FirstOrDefault ();
           if ( es != null ) {
               return es.b;
           }
           else {
               return String.Empty;
           }
       }

或者

        Func<List<A> , String , String> Get = (list , str) => {
            var es = list.Where ( o => o.a.Equals ( str ) ).FirstOrDefault ();
            if ( es != null ) {
                return es.b;
            }
            else {
                return String.Empty;
            }
        };

       String ee = Get ( aList , "1" ); 

  • 编写扩展方法

            自行发挥!

posted @ 2010-03-22 17:43 RicoRui 阅读(1145) 评论(7) 编辑 收藏

 回复 引用 查看   
#1楼 2010-03-22 17:50 chenming      
原来是这样搞出来的。
明白了

 回复 引用 查看   
#2楼 2010-03-22 18:12 StephenJu      
路过... very good!
 回复 引用 查看   
#3楼 2010-03-22 19:56 Ivony...      
莫名其妙的说。。。。。

String c = aList.Where ( o => o.a.Equals ( "6" ) ) 
                .Select(o=>o.b)
                .FirstOrDefault() ?? "";


或者:
String c = aList.Where ( o => o.a.Equals ( "6" ) ) 
                .Select(o=>o.b)
                .DefaultIfEmpty( "" )
                .First();


 回复 引用 查看   
#4楼 2010-03-22 21:02 560889223      
同意Ivony的观点。
我觉得一个很重要的问题就是在.Select方法的结果明明是集合或者说泛型枚举时,却赋值给一个string类型的变量。这应该是基本的语法规则了(对于C#这种强类型语言)。

' a=a
 回复 引用 查看   
#6楼 2010-03-23 08:28 Bob-wei      
取IEnumberable<String>的第一个字符串,用Ivony的做法就可以了,很简洁。

 回复 引用 查看   
#7楼 2010-03-25 23:58 DiryBoy      
如果只需要第一个,可以用 Find 扩展方法啊。
string result = aList.Find(o => o.a == "6").b;