【问题标题】:How can I compare two List and match it如何比较两个 List 并匹配它
【发布时间】:2016-10-20 21:25:42
【问题描述】:

我有两个列表,一个包含主数据,一个包含错误数据。所以现在我想比较这个 thow 列表并将错误的与正确的匹配。

 public class Data
{
    public int Id { get; set; }
    public string Text{ get; set; }
}

var masterList = new List<Data> { new Data { id = 1, Text = "Hello" }, new Data() {id = 2, Text ="Ciao"} };
var wrongList = new List<Data> { new Data { id = 1, Text = "Ciao" }, new Data() {id = 2, Text ="Morning"} };

现在在 masterList 中,id 1 的文本是“Hello”,而在 wrongList 中,id 为 1 的文本是“Ciao”​​。

但是 id 为 2 的文本有文本“Hello”,所以我如何匹配这两个列表,当列表中有匹配项时,我得到正确的文本到正确的 Id...

如果文本匹配,那么我将有一个新的列表如下:

id = 2, Text = "Ciao"

希望你能理解我的问题!

感谢您的帮助...

【问题讨论】:

  • 给定示例中的预期结果
  • 我更新了我的问题
  • 示例的预期输出只是masterList 的内容。甚至需要进行什么比较?
  • @user1861065 - 现在我更加困惑了..
  • @user1861065: var matches = masterList; - 喜欢吗?说真的,这里没有逻辑可以实现。至少不是根据给出的例子。

标签: c# asp.net-mvc linq list comparison


【解决方案1】:

您可以使用 linq 和 Intersect 轻松做到这一点,并使 Data 实现 IEquatable&lt;Data&gt;

var matches = masertList.Intersect(wrongList);

更新:根据 cmets,这是一个实现 IEqualityComparer&lt;Data&gt; 的解决方案

class DataComparer : IEqualityComparer<Data>
{
    // Datas are equal if their names and Id are equal.
    public bool Equals(Data x, Data y)
    {
        if (ReferenceEquals(x, y))
            return true;

        if (ReferenceEquals(x, null) ||
            ReferenceEquals(y, null))
            return false;

        return x.Id == y.Id && x.Text == y.Text;
    }

    public int GetHashCode(Data data)
    {
        if (ReferenceEquals(product, null))
            return 0;

        return (product.Name == null ? 0 : product.Name.GetHashCode()) ^ product.Code.GetHashCode();
    }
}

现在,你只需:var matches = masertList.Intersect(wrongList, new DataComparer());

【讨论】:

  • 这样我得到以下错误:枚举没有结果
  • 这是因为类默认使用reference相等。由于您的列表包含不同的对象(其中一些恰好具有相同的属性值),因此交集将为空。
  • @user1861065 Data需要根据你的需要实现IEquatable&lt;Data&gt;。或者你可以实现一个自定义的IEqualityCompararer&lt;Data&gt;,并使用Intersect的对应重载。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-25
  • 1970-01-01
  • 1970-01-01
  • 2019-12-26
  • 1970-01-01
相关资源
最近更新 更多