两个IEnumerable<T>兼容的对象的差集
static
void
GetDiff()
{
List < string > myCars = new List < String >
{ " Yugo " , " Aztec " , " BMW " };
List < string > yourCars = new List < String >
{ " BMW " , " Saab " , " Aztec " };
var carDiff = (from c in myCars select c)
.Except(from c2 in yourCars select c2);
Console.WriteLine( " Here is what you don't have, but I do: " );
foreach ( string s in carDiff)
Console.WriteLine(s); // Prints Yugo.
}
{
List < string > myCars = new List < String >
{ " Yugo " , " Aztec " , " BMW " };
List < string > yourCars = new List < String >
{ " BMW " , " Saab " , " Aztec " };
var carDiff = (from c in myCars select c)
.Except(from c2 in yourCars select c2);
Console.WriteLine( " Here is what you don't have, but I do: " );
foreach ( string s in carDiff)
Console.WriteLine(s); // Prints Yugo.
}
-------------------------------------------------
在投影操作中,由于结果集合类型是隐式的,在编译时才能确定,所以这里强制规定必须使用var
//
Error! Can't return a var data type!
static var GetProjectedSubset()
{
Car[] myCars = new Car[] {
new Car{ PetName = " Henry " , Color = " Silver " , Speed = 100 , Make = " BMW " },
new Car{ PetName = " Daisy " , Color = " Tan " , Speed = 90 , Make = " BMW " },
new Car{ PetName = " Mary " , Color = " Black " , Speed = 55 , Make = " VW " },
new Car{ PetName = " Clunker " , Color = " Rust " , Speed = 5 , Make = " Yugo " },
new Car{ PetName = " Melvin " , Color = " White " , Speed = 43 , Make = " Ford " }
};
var makesColors = from c in myCars select new { c.Make, c.Color };
return makesColors; // Nope!
}
static var GetProjectedSubset()
{
Car[] myCars = new Car[] {
new Car{ PetName = " Henry " , Color = " Silver " , Speed = 100 , Make = " BMW " },
new Car{ PetName = " Daisy " , Color = " Tan " , Speed = 90 , Make = " BMW " },
new Car{ PetName = " Mary " , Color = " Black " , Speed = 55 , Make = " VW " },
new Car{ PetName = " Clunker " , Color = " Rust " , Speed = 5 , Make = " Yugo " },
new Car{ PetName = " Melvin " , Color = " White " , Speed = 43 , Make = " Ford " }
};
var makesColors = from c in myCars select new { c.Make, c.Color };
return makesColors; // Nope!
}
可以使用ToArray<T>()把投影结果集转化为标志的CRL数组对象:
//
Return value is now an Array.
static Array GetProjectedSubset()
{
Car[] myCars = new Car[]{
new Car{ PetName = " Henry " , Color = " Silver " , Speed = 100 , Make = " BMW " },
new Car{ PetName = " Daisy " , Color = " Tan " , Speed = 90 , Make = " BMW " },
new Car{ PetName = " Mary " , Color = " Black " , Speed = 55 , Make = " VW " },
new Car{ PetName = " Clunker " , Color = " Rust " , Speed = 5 , Make = " Yugo " },
new Car{ PetName = " Melvin " , Color = " White " , Speed = 43 , Make = " Ford " }
};
var makesColors = from c in myCars select new { c.Make, c.Color };
// Map set of anonymous objects to an Array object.
// Here were are relying on type inference of the generic
// type parameter, as we don't know the type of type!
return makesColors.ToArray();
}
static Array GetProjectedSubset()
{
Car[] myCars = new Car[]{
new Car{ PetName = " Henry " , Color = " Silver " , Speed = 100 , Make = " BMW " },
new Car{ PetName = " Daisy " , Color = " Tan " , Speed = 90 , Make = " BMW " },
new Car{ PetName = " Mary " , Color = " Black " , Speed = 55 , Make = " VW " },
new Car{ PetName = " Clunker " , Color = " Rust " , Speed = 5 , Make = " Yugo " },
new Car{ PetName = " Melvin " , Color = " White " , Speed = 43 , Make = " Ford " }
};
var makesColors = from c in myCars select new { c.Make, c.Color };
// Map set of anonymous objects to an Array object.
// Here were are relying on type inference of the generic
// type parameter, as we don't know the type of type!
return makesColors.ToArray();
}
注意:
1、不能给ToArray<T>()指定类型,因为这里是隐式类型,到编译时才可用。
2、不能使用System.Array 的定义语法,只能使用该对象,同样因为隐式类型。
3、当需要使用投影的查询结果集时,把其转换为Array类型是必须的,当然这样会丢失强类型的好处。