0Pricing
C# Academy · 课时

具体化(ToList、ToDictionary)与性能提示

使用 ToList/ToArray/ToDictionary 将延迟查询转换为具体集合;避免重复枚举,并了解键必须唯一的规则。

具体化(ToList、ToDictionary)与性能提示 是 CoddyKit 上的免费 C# Academy 课时。 这是第 2 节课,共 3 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 C# Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 C# Academy 课程共包含 3 节课。

为什么要物化

延迟查询会在每次枚举时运行。

  • 请物化以获取快照
  • 避免昂贵查询被重复运行
  • 根据需求选择 List、Array 或 Dictionary

ToList / ToArray

ToList/ToArray 会运行一次查询并存储结果;之后源的更改不会反映出来。

using System;
using System.Collections.Generic;
using System.Linq;

public class Program
{
  public static void Main(string[] args)
  {
    List<int> data = new List<int>(new int[] { 1, 2, 3, 4 });

    var evensQuery = data.Where(x => x % 2 == 0);
    int[] evensArray = evensQuery.ToArray(); // snapshot now
    List<int> evensList = evensQuery.ToList(); // snapshot now

    data.Add(6); // changes after materialization

    Console.WriteLine("Array:");
    foreach (int x in evensArray) Console.WriteLine(x); // 2,4
    Console.WriteLine("List:");
    foreach (int x in evensList) Console.WriteLine(x);  // 2,4
  }
}

ToDictionary 基础

ToDictionary 会将结果物化为 Dictionary<K,V>。键必须唯一,否则会抛出异常。

using System;
using System.Collections.Generic;
using System.Linq;

public sealed class City
{
  public string Name;
  public int Population;
  public City(string name, int pop){ Name = name; Population = pop; }
}

public class Program
{
  public static void Main(string[] args)
  {
    var cities = new City[]
    {
      new City("Oslo", 634000),
      new City("Rome", 2873000),
      new City("Riga", 605000)
    };

    Dictionary<string, int> byName = cities
      .ToDictionary(c => c.Name, c => c.Population);

    Console.WriteLine(byName["Rome"]); // 2873000
  }
}

重复键:ToLookup/GroupBy

当键可能重复时,请优先使用 ToLookup(多值字典)或 GroupBy,而不是 ToDictionary。

using System;
using System.Collections.Generic;
using System.Linq;

public sealed class Item { public string Category; public string Name; public Item(string c, string n){ Category=c; Name=n; } }

public class Program
{
  public static void Main(string[] args)
  {
    var items = new Item[]
    {
      new Item("Food","Apple"),
      new Item("Food","Bread"),
      new Item("Tool","Hammer"),
      new Item("Tool","Wrench")
    };

    // If keys may repeat, use ToLookup (multi-value) or GroupBy
    var lookup = items.ToLookup(i => i.Category, i => i.Name);

    foreach (var g in lookup)
    {
      Console.WriteLine(g.Key + ":");
      foreach (var name in g) Console.WriteLine(" - " + name);
    }
  }
}

避免多次枚举

每次枚举都可能重新执行相关工作。如果您要多次迭代,请先物化一次(例如使用 ToList)。

using System;
using System.Collections.Generic;
using System.Linq;

public static class Expensive
{
  public static IEnumerable<int> Numbers()
  {
    // Simulate expensive enumeration (prints when enumerated)
    for (int i = 1; i <= 3; i++)
    {
      Console.WriteLine("Produce " + i);
      yield return i;
    }
  }
}

public class Program
{
  public static void Main(string[] args)
  {
    var query = Expensive.Numbers().Select(x => x * x);

    Console.WriteLine("First pass:");
    foreach (int x in query) Console.WriteLine(x);

    Console.WriteLine("Second pass (re-enumerates work):");
    foreach (int x in query) Console.WriteLine(x);

    Console.WriteLine("Cache with ToList:");
    List<int> cached = query.ToList(); // runs once
    foreach (int x in cached) Console.WriteLine(x); // no extra production logs
  }
}

物化检查清单

检查清单:

  • 使用 ToList/ToArray 获取快照。
  • 键唯一时使用 ToDictionary;否则使用 ToLookup/GroupBy。
  • 避免对昂贵的源进行多次枚举;一次性缓存。
  • 在边界处(I/O、数据库调用)附近进行物化,以获得可预测的行为。

ToDictionary 的要求

快速检查:使用 ToDictionary(keySelector) 处理序列时,必须满足什么条件?

总结

总结:使用 ToList/ToArray 获取快照,使用 ToDictionary 进行快速查找(键必须唯一),并通过缓存避免重新运行昂贵的查询。

常见问题解答

「具体化(ToList、ToDictionary)与性能提示」课时是免费的吗?

是的 — 「具体化(ToList、ToDictionary)与性能提示」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 C# Academy 课程的其余内容,请升级到 CoddyKit PRO。 C# Academy 课程共包含 3 节课。

「具体化(ToList、ToDictionary)与性能提示」这节课中我会学到什么?

使用 ToList/ToArray/ToDictionary 将延迟查询转换为具体集合;避免重复枚举,并了解键必须唯一的规则。 你通过在浏览器中直接运行的动手代码来练习 C# Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 C# Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 C# Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 2 节课,共 3 节。

「具体化(ToList、ToDictionary)与性能提示」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 C# Academy 课中编写并运行代码吗?

能。每节 C# Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. GroupBy、Join、Aggregate 与投影(匿名类型)
  2. 具体化(ToList、ToDictionary)与性能提示
  3. 可组合性技巧
← 返回 C# Academy