c# - 如何使用 LINQ 从多列列表中获取 x 行

标签 c# linq

我有一个看起来像这样的列表:

catId    itemId    value
  1        5         "some text"
  1        19        "some text"
  1        21        "some text"
  2        6         "some text"
  2        8         "some text"
  3        9         "some text"
  3        82        "some text"

注意 catId 列。我将如何为第一列中的每个唯一值取 2 行(或删除额外的行)。 catId=1 只有 2 行 catId=2 有 2 行等等?

我的列表名为 distinctXSelling,目前我是这样使用它的:

            foreach (var item in distinctXSelling)
            {
                xSelling.InnerHtml += item.value;
            }

最佳答案

您可以按类别 ID 对项目进行分组,然后从每个组中选择前两个项目,然后将组序列展平为源项目序列。这看起来像:

var query = source.GroupBy(item => item.catId)
                  .SelectMany(catGroup => catGroup.Take(2));

请注意 Take方法接受最多 一定数量的项目,因此如果类别只有一个项目,则不会抛出此问题。

正如 BrokenGlass 指出的那样,如果您希望按特定顺序过滤项目,您可能需要一个 .OrderBy(可能还需要一个 .ThenBy)。

您可能还想考虑将循环替换为:

xSelling.InnerHtml = string.Concat(query.Select(item => item.value));

关于c# - 如何使用 LINQ 从多列列表中获取 x 行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5706474/

相关文章:

C# 和 SQL 服务器 : execute stored procedure

c# - 如何从数组中提取 3 个随机值?

c# - EF 不延迟加载 View

linq - 请帮助理解 LINQ、C# 中的字典

c# - 为什么 Enumerable.Cast<> 不使用我的转换运算符?

c# - EF Core Azure Cosmos DB 提供程序与 Cosmos LINQ to SQL 转换

c# - 是什么让 Visual Studio 调试器停止评估 ToString 覆盖?

c# - MVC5 T4 ModelMetadata.Properties IsNullable 或 IsRequired

c# - 使用 selenium、Nunit、Selenium Grid、C#、webdriver/remote control 的自动浏览器测试

c# - 如何获取 linq `ForEach` 语句以返回有关为每个列表对象进行的方法调用的数据?