【问题标题】:Linq merging resultsLinq 合并结果
【发布时间】:2011-01-03 07:05:11
【问题描述】:

我正在处理列表中的列表。这就是我目前的搜索方式:

var tags = from fd in BigList
           from tag in fd.Tags
           where tag.Id == selectedTag.Id ||
                 tag.Id == ID.TIMESTAMP
           select new { fd.Name, tag.Id, tag.Value };

然后我遍历结果集并记住 Timestamp 何时弹出下一个条目,不用说这很草率,我很肯定有更好的方法使用 Linq,我似乎找不到语法.

这是一些示例输出(Id 表示其中存储了什么类型的数据,例如时间戳):

Name | Id | Value
-----|----|----------
0000 | 1  | <timestamp>
0000 | 2  | 1.2
...
9999 | 1  | <timestamp>
9999 | 2  | 6.3

我需要Id = selectedTag.Id 的所有实例。我只想要一个包含NameIdValueTimestamp 的列表,但问题是我的上述尝试为每个项目返回 2 个条目(1 个用于时间戳,1 个用于值)。有没有办法使用 Linq 做到这一点?最好使用查询语法! :)

【问题讨论】:

  • 它返回一个列表,其中每个项目有 2 个条目(1 个用于时间戳,1 个用于我正在查找的值)所以除非我遗漏了一些明显的东西,否则仍有相当多的腿-努力检索每个条目的时间戳。
  • 你只需要两次from tag in fd.Tags——一次是where tag.Id == selectedTag.Id,一次是where tag.Id == ID.TIMESTAMP
  • @Gabe:我相信我也已经尝试过了(通过 2 个单独的查询)?但是然后呢?同时迭代两者?连接它们?
  • 当您有两个匹配项时,您希望在您的值列中包含什么?

标签: c# linq .net-3.5


【解决方案1】:

这是一种作为单个查询的方法:

var tags = from fd in BigList
           from tag in fd.Tags
           where tag.Id == selectedTag.Id
           from tag2 in fd.Tags
           where tag.Id == ID.TIMESTAMP
           select new { fd.Name, id = tag.Value, timestamp = tag2.Value };

这是一种通过加入两个查询的方法:

var tags = from fd in BigList
           from tag in fd.Tags
           where tag.Id == selectedTag.Id
           select new { fd.Name, id = tag.Value };
var tag2 = from fd in BigList
           from tag2 in fd.Tags
           where tag.Id == ID.TIMESTAMP
           select new { fd.Name, timestamp = tag2.Value };
var data = from id in tags
           join ts in tag2 on id.Name equals ts.Name
           select new { id.Name, id.id, ts.timestamp };

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-20
    • 2019-08-01
    • 2015-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多