LINQ
一. Where :选择行.
IEnumerable<TSource> Where<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate);
IEnumerable<TSource> Where<TSource>(f => 一个条件表达式)
public static IEnumerable<TSource> Take<TSource>(this IEnumerable<TSource> source, int count);
Take : 选择行
a.task(5) //选择前5行.
例:
List.Where(f => typeof(Csla.Core.IPropertyInfo).IsAssignableFrom(f.FieldType))
红色部分既可以是一条语句,也可以是一段代码块{…},代码块里面有一个返回值. List中有过少个元素.
则这条语句/代码块就执行多少此.
里面的表达式不不会立即执行,只是什么时候需要使用返回值的时候才执行ladm表达式.
static void Main(string[] args)
{
List<int> nList = new List<int>();
IEnumerable<int> sFilter;
int nCount;
nList.Add(1);
nList.Add(2);
nList.Add(3);
nList.Add(4);
nList.Add(5);
nList.Add(6);
nList.Add(7);
nList.Add(8);
nList.Add(9);
nList.Add(10);
nList.Add(11);
sFilter = nList.Where(f =>
{ //有多少个元素,这个代码块就执行多少此.
if (f > 5)
{
if (f.Equals(10))
{
return true;
}
}
else
{
return false;
}
return false;
});
nCount = sFilter.Count(); //这里才开始执行Where中的代码块.
}
二.Select //选择列.
public static IEnumerable<TResult> Select<TSource, TResult>(this IEnumerable<TSource> source, Func<TSource, TResult> selector);
IEnumerable<CSLAPropertyInfo>.Select(f=>{代码块…})
private static IEnumerable<CSLAPropertyInfo> LoadFromType(Type type)
{
var staticFields = type.GetFields(BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.Public);
return staticFields.Where(f => typeof(Csla.Core.IPropertyInfo).IsAssignableFrom(f.FieldType))
.Select(f =>
{
bool isChild = false;
var property = f.GetValue(null) as Csla.Core.IPropertyInfo;
//判断是不是孩子对象
var fieldType = f.FieldType;
if (fieldType.IsGenericType && fieldType.GetGenericTypeDefinition() == typeof(PropertyInfo<>))
{
var argType = fieldType.GetGenericArguments()[0];
while (argType.BaseType != null)
{
if (argType.IsGenericType && argType.GetGenericTypeDefinition() == typeof(GBusinessListBase<,>))
{
isChild = true;
break;
}
argType = argType.BaseType;
}
}
return new CSLAPropertyInfo(property, isChild);
});
}