积极答复者
【LINQ】请教一个关于c#中语法的问题

问题
-
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
答案
-
第一问:
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);
- 已编辑 ThankfulHeartModerator 2012年10月15日 2:13
- 已建议为答案 Mike FengModerator 2012年10月15日 11:01
- 已标记为答案 jinwb1982 2012年10月21日 1:26
-
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代表什么啦,很清晰。
- 已建议为答案 Mike FengModerator 2012年10月15日 11:01
- 已标记为答案 jinwb1982 2012年10月21日 1:26
全部回复
-
第一问:
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);
- 已编辑 ThankfulHeartModerator 2012年10月15日 2:13
- 已建议为答案 Mike FengModerator 2012年10月15日 11:01
- 已标记为答案 jinwb1982 2012年10月21日 1:26
-
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代表什么啦,很清晰。
- 已建议为答案 Mike FengModerator 2012年10月15日 11:01
- 已标记为答案 jinwb1982 2012年10月21日 1:26