如何创建将打印LINQ查询结果的方法?

时间:2019-02-09 18:01:26

标签: c# linq methods

我需要创建一个将打印查询结果的方法,这样我就不必在每次查询后重新键入打印结果。在我指定只返回特定变量而不是列表中的所有变量之前,我已经编写了一种似乎有效的方法。

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)

2 个答案:

答案 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);

的参数