none
【LINQ】请教一个关于c#中语法的问题 RRS feed

  • 问题

  • public T_Juser GetUserById(string id)

    {

    var user = Session.Query<T_Juser>().Where(x => x.Id.Trim() == id).SingleOrDefault();

    }

    以上代码是实体类cs中的一个方法。注意黑色字体加粗地方

    问题一:定义user为什么使用var呢?在我的理解中var是javascript中的定义类型,可这里是c#语法,按整理应该是int、string等类型啊?

    问题二:Where(x => x.Id.Trim() == id) 请问这是什么写法?

    听他们说这是linq语法,能不能说说这代表什么意思呢?其中的x代表什么呢?可不可以换成其他字符呢?

    请高手明示,谢谢!


    煜诚海参专卖 淘宝店铺:http://jinweb.taobao.com

    2012年10月15日 1:56

答案

  • 首先,var也是C#的关键字,可以代表任意类型数据。

    Where(x => x.Id.Trim() == id)是Linq提供的语法,获取满足条件的数据集合,x表示集合中的任意一条数据,x => x.Id.Trim() == id即表示遍历这个集合,返回满足x.Id.Trim() == id的所有数据。

    2012年10月15日 2:10
  • 第一问:

    C#从2.0开始已经引入了这个“var”关键字,这个关键字会根据反馈的结果自动推断类型(隐式类型),和Js类似;不过注意,var一旦被赋值之后(类型确定之后),无法更改成其他与之不兼容的类型。js可以任意更改。

    问题二:

    Lambda表达式,x完全可以替换成一个其它的不重复变量。其实其本质是一个委托——你反射Where便可以看到:‘

    [__DynamicallyInvokable]
    public static IEnumerable<TSource> Where<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate)
    {
        if (source != null)
        {
            if (predicate != null)
            {
                if (source as Enumerable.Iterator<TSource> == null)
                {
                    if (source as TSource[] == null)
                    {
                        if (source as List<TSource> == null)
                        {
                            return new Enumerable.WhereEnumerableIterator<TSource>(source, predicate);
                        }
                        else
                        {
                            return new Enumerable.WhereListIterator<TSource>((List<TSource>)source, predicate);
                        }
                    }
                    else
                    {
                        return new Enumerable.WhereArrayIterator<TSource>((TSource[])source, predicate);
                    }
                }
                else
                {
                    return ((Enumerable.Iterator<TSource>)source).Where(predicate);
                }
            }
            else
            {
                throw Error.ArgumentNull("predicate");
            }
        }
        else
        {
            throw Error.ArgumentNull("source");
        }
    }

    注意我上面粗体下划线部分——这个是一个委托。通常而言,委托必须传入一个已经定义的函数名称(该函数参数类型/顺序和个数,以及返回值必须和委托完全符合)。不过为了简化,我们可以用Lambda进行处理。进一步地:

    Func<int,int,int> Add = (a,b)=>a+b;
    
    //调用
    Add(1,2);

    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    2012年10月15日 2:12
    版主
  •     var隐式类型,由编译器确定它的类型是什么,从你的代码中看 var user 的类型为:T_Juser,因为你的where方法返回的是T_Juser类型,编译器以此为依据确定var的类型。

        where方法顾名思义就是条件过滤,返回满足条件的信息,x => x.Id.Trim() == id为条件的表达式(Lambda表达式),这段代码:  

        public T_Juser GetUserById(string id)
        {
             var user = Session.Query<T_Juser>().Where(x => x.Id.Trim() == id).SingleOrDefault();
        }

        也可以用以下代码实现():    

     public T_Juser GetUserById(string id)
       {
            foreach(T_Juser x in Session.Query<T_Juser>())
            {
                  if(x.Id.Trim() == id)
                  {
                         return x;
                  }
            }
            return null;
        }
        

        从两段代码可以看出,Lambda表达式帮我们简化了代码量,使代码看的更清晰,我想应该不用我在解释x代表什么啦,很清晰。

    2012年10月15日 10:16

全部回复

  • 首先,var也是C#的关键字,可以代表任意类型数据。

    Where(x => x.Id.Trim() == id)是Linq提供的语法,获取满足条件的数据集合,x表示集合中的任意一条数据,x => x.Id.Trim() == id即表示遍历这个集合,返回满足x.Id.Trim() == id的所有数据。

    2012年10月15日 2:10
  • 第一问:

    C#从2.0开始已经引入了这个“var”关键字,这个关键字会根据反馈的结果自动推断类型(隐式类型),和Js类似;不过注意,var一旦被赋值之后(类型确定之后),无法更改成其他与之不兼容的类型。js可以任意更改。

    问题二:

    Lambda表达式,x完全可以替换成一个其它的不重复变量。其实其本质是一个委托——你反射Where便可以看到:‘

    [__DynamicallyInvokable]
    public static IEnumerable<TSource> Where<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate)
    {
        if (source != null)
        {
            if (predicate != null)
            {
                if (source as Enumerable.Iterator<TSource> == null)
                {
                    if (source as TSource[] == null)
                    {
                        if (source as List<TSource> == null)
                        {
                            return new Enumerable.WhereEnumerableIterator<TSource>(source, predicate);
                        }
                        else
                        {
                            return new Enumerable.WhereListIterator<TSource>((List<TSource>)source, predicate);
                        }
                    }
                    else
                    {
                        return new Enumerable.WhereArrayIterator<TSource>((TSource[])source, predicate);
                    }
                }
                else
                {
                    return ((Enumerable.Iterator<TSource>)source).Where(predicate);
                }
            }
            else
            {
                throw Error.ArgumentNull("predicate");
            }
        }
        else
        {
            throw Error.ArgumentNull("source");
        }
    }

    注意我上面粗体下划线部分——这个是一个委托。通常而言,委托必须传入一个已经定义的函数名称(该函数参数类型/顺序和个数,以及返回值必须和委托完全符合)。不过为了简化,我们可以用Lambda进行处理。进一步地:

    Func<int,int,int> Add = (a,b)=>a+b;
    
    //调用
    Add(1,2);

    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    2012年10月15日 2:12
    版主
  •     var隐式类型,由编译器确定它的类型是什么,从你的代码中看 var user 的类型为:T_Juser,因为你的where方法返回的是T_Juser类型,编译器以此为依据确定var的类型。

        where方法顾名思义就是条件过滤,返回满足条件的信息,x => x.Id.Trim() == id为条件的表达式(Lambda表达式),这段代码:  

        public T_Juser GetUserById(string id)
        {
             var user = Session.Query<T_Juser>().Where(x => x.Id.Trim() == id).SingleOrDefault();
        }

        也可以用以下代码实现():    

     public T_Juser GetUserById(string id)
       {
            foreach(T_Juser x in Session.Query<T_Juser>())
            {
                  if(x.Id.Trim() == id)
                  {
                         return x;
                  }
            }
            return null;
        }
        

        从两段代码可以看出,Lambda表达式帮我们简化了代码量,使代码看的更清晰,我想应该不用我在解释x代表什么啦,很清晰。

    2012年10月15日 10:16