我需要创建一个将打印查询结果的方法,这样我就不必在每次查询后重新键入打印结果。在我指定只返回特定变量而不是列表中的所有变量之前,我已经编写了一种似乎有效的方法。
static void Print(this IEnumerable<Game> source)
{
foreach(var q in source)
{
Console.WriteLine(q);
}
Console.WriteLine();
var count = source.Count();
Console.WriteLine("The query pulls: {0} results.", count);
Console.WriteLine();
}
此方法可以正确打印出具有这种查询类型的查询结果列表:
var query4 = games.Where(g => g.PeakPlayers >100000)
.Where(g => g.ReleaseDate > new DateTime(01/01/2013));
Print(query4);
在结果中指定我要选择的内容时抛出错误:
var query10 = games.Where(g => g.Price == 0).Select(g => g.Name);
Print(query10)
答案 0 :(得分:1)
我会让您的方法更通用:
static void Print<T>(this IEnumerable<T> source)
{
foreach(var q in source)
{
Console.WriteLine(q); // implicitly calls T.ToString();
}
Console.WriteLine();
var count = source.Count();
Console.WriteLine("The query pulls: {0} results.", count);
Console.WriteLine();
}
然后,您可以将复杂对象列表或仅单个属性传递给它:
games.Select(g => g.Name).Print();
如果要进一步改善此功能,可以通过使用反射获取属性列表,遍历属性并为每个项目连续打印值来添加对对象和结构的支持。
或者,您可以添加一个可选参数,以定义如何“打印”每一项(绕过隐式ToString
):
static void Print<T>(this IEnumerable<T> source, Func<string, T> toString)
{
foreach(var q in source)
{
Console.WriteLine(toString(q));
}
Console.WriteLine();
var count = source.Count();
Console.WriteLine("The query pulls: {0} results.", count);
Console.WriteLine();
}
并传入您的“ toString”函数:
games.Print(g => "Name: " + g.Name);
答案 1 :(得分:0)
此方法static void Print(this IEnumerable<Game> source)
期望类型为IEnumerable<T>
的{{1}}:
此处您仅选择Game
属性:Name
我认为是一个字符串,它违反了var query10 = games.Where(g => g.Price == 0).Select(g => g.Name);