【问题标题】:Comparing DataRow with other DataRows将 DataRow 与其他 DataRow 进行比较
【发布时间】:2021-07-22 14:58:33
【问题描述】:

我有一个通用的List MatchingResult 类型(参见下面的MatchingResult 类型实现)

我能够使用 for 循环来获得我想要的结果,但我也想知道使用 lambda 表达式或 LINQ,如何提取与 @987654325 匹配的所有数据行(来自 Matches 属性) @属性?

MatchingResult 类:

public class MatchingResult
{
    public DataRow Left { get; set; }

    public IEnumerable<DataRow> Matches { get; set; }
}

这是我的MatchingResult列表:

List<MatchingResult> list = PopulateList();

最终输出将是满足上述条件的DataRows 列表。

编辑:DataRows 具有相同数量的列/名称和相同的顺序。

样本数据:

数据行(左)

Column1 | Column2 | Column3
--------+---------+--------
A       |   X     |  Y

数据行(匹配)

Column1 | Column2 | Column3
--------+---------+--------
A       |   X     |  Y
A       |   O     |  W
A       |   X     |  Y

在上面的示例中,预期的结果是包含以下数据的 DataRows 列表:

Column1 | Column2 | Column3
--------+---------+--------
A       |   X     |  Y
A       |   X     |  Y 

【问题讨论】:

  • 为了包含您想要保留的DataRows,您要专门匹配什么。
  • Left 属性中的 DataRow,将其与 Matches 属性中的 DataRow 列表进行比较。 DataRows 包含相同的列。
  • 到目前为止你尝试过什么?你在哪里卡住了?
  • 所以您只想比较Matches 属性中的列名与Left 属性(列名,如果它们匹配则包括DataRow 对吗?
  • 没错@zaggler

标签: c#


【解决方案1】:

您可以轻松使用现有的DataRowComparer.Default 来比较所有字段:

List<MatchingResult> matches = list
    .Select(m => new MatchingResult 
    {
        Left = m.Left,
        Matches = m.Matches.Where(r => DataRowComparer.Default.Equals(m.Left, r)).ToList()
    }).ToList();

【讨论】:

  • 很好的答案。请注意,他要求一个更简单的结果 - 数据行列表List&lt;DataRow&gt; Matches = list.Select(m =&gt; m.Matches.Where(r =&gt; DataRowComparer.Default.Equals(m.Left, r))).ToList()
  • @ShayD:好吧,我忽略了这一点,谢谢。但是你需要使用SelectMany而不是Select
  • 好的。你现在实际上帮助我吸收了SelectMany 功能。我的表情应该返回List&lt;List&lt;DataRow&gt;&gt;?和SelectMany 将这些列表合并为一个列表。是谁?
  • @ShayD:是的,SelectMany 从序列/集合中提取项目,因此“展平”它们并将它们全部放入一个序列中。合并会建议删除重复项,但事实并非如此(那么您需要Distinct)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多