IEnumerable<T> original = 原始集合;
IEnumerable<T> filtered = original.Where(Predicate<T>);假如这样,original与filtered是指向内存中独立的区域吗?如果不是,那么每次foreach(var t in filtered)时,等于都会遍历一遍original里所有元素?假如:
IEnumerable<T> original = 原始集合;
IEnumerable<T> filtered = original.ToArray();
这时再foreach(var t in filtered),这时就不是遍历original里所有元素?
我不知道理解的对不对。
IEnumerable<T> filtered = original.Where(Predicate<T>);假如这样,original与filtered是指向内存中独立的区域吗?如果不是,那么每次foreach(var t in filtered)时,等于都会遍历一遍original里所有元素?假如:
IEnumerable<T> original = 原始集合;
IEnumerable<T> filtered = original.ToArray();
这时再foreach(var t in filtered),这时就不是遍历original里所有元素?
我不知道理解的对不对。
IEnumerable<T> filtered = original.Where(Predicate<T>);
或者
IEnumerable<T> original = 原始集合;
IEnumerable<T> filtered = original.ToArray();
我的理解:都是指向不同的内存区域.遍历filtered的时候,和original没有关系了
class Program
{
static readonly Person[] peopel =
{
new Person { Name="xhtmldivcss00", Age= 300 },
new Person { Name="xhtmldivcss01", Age= 301 },
new Person { Name="xhtmldivcss02", Age= 302 },
new Person { Name="xhtmldivcss03", Age= 303 },
new Person { Name="xhtmldivcss04", Age= 304 },
new Person { Name="xhtmldivcss05", Age= 305 },
new Person { Name="xhtmldivcss06", Age= 306 },
new Person { Name="xhtmldivcss07", Age= 307 },
new Person { Name="xhtmldivcss08", Age= 308 },
new Person { Name="xhtmldivcss09", Age= 309 },
new Person { Name="xhtmldivcss10", Age= 310 },
};
static void Main(string[] args)
{
IEnumerable<Person> group = peopel;
IEnumerable<Person> filtered1 = group.Where(p => p.Age > 308);
foreach (var p in filtered1)
Console.WriteLine("Name: {0}, Age: {1}", p.Name, p.Age); IEnumerable<Person> filtered2 = group.Where(p => p.Name.Contains("7")); Console.WriteLine("----------- filtered 2 ");
foreach( var p in filtered2)
Console.WriteLine("Name: {0}, Age: {1}", p.Name, p.Age); Console.WriteLine("----------- filtered 3 ");
IEnumerable<Person> filtered3 = group.Where(p => p.Age < 303).ToArray();
foreach(var p in filtered3)
Console.WriteLine("Name: {0}, Age: {1}", p.Name, p.Age); Console.WriteLine("----------- Array");
foreach(var p in filtered3)
Console.WriteLine("Name: {0}, Age: {1}", p.Name, p.Age);
Console.Read(); }
}
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
}
也就是说遍历filtered1, filtered2, filtered3时都等于遍历group(原始集合)里的每个元素,也包括.ToArray()时。直到最后一次遍历(已经转换成Array)时,才是在遍历内存中与group另外的内存区域,之前三个foreach都是在遍历group的内存区域。不知道我理解的对不对。
对于T为引用类型,不管对于Where还是ToArray,filtered集合都是New出来的,而集合的内容仍然是original内容的引用,这个可以通过筛选后修改引用类型成员变量来测试
还是建议用reflector看看源码...
IEnumerable<T> filtered = original.Where(Predicate<T>);
我的问题是这样Where之后“新生成”的filtered是原始original的子集的同时,是在不同的内在区域?而我现在觉得不像。而且根本就没有发生“新生成”这个动作。
{
if (source == null)
{
throw Error.ArgumentNull("source");
}
if (predicate == null)
{
throw Error.ArgumentNull("predicate");
}
if (source is Iterator<TSource>)
{
return ((Iterator<TSource>) source).Where(predicate);
}
if (source is TSource[])
{
return new WhereArrayIterator<TSource>((TSource[]) source, predicate);
}
if (source is List<TSource>)
{
return new WhereListIterator<TSource>((List<TSource>) source, predicate);
}
return new WhereEnumerableIterator<TSource>(source, predicate);
}
ok! that's it! 这就是我想确认的东西!