比较两个列表并找到类似的数据

时间:2014-08-22 13:42:44

标签: c# list

我有以下课程。

public class ClassA
{
    public int Id { get; set; }
    public string data { get; set; }
    public string value { get; set; }
}

public class ClassB
{
    public int Id { get; set; }
    public string data { get; set; }
    public string value { get; set; }
}

public class ClassC
{
    public void ProcessData(List<ClassA> clsA , List<ClassB> clsB)
    {
        // what???
    }
}

列表A中的值:

enter image description here

列表B中的值:

enter image description here

我想将列表A与列表B进行比较。 即:从列表A中获取数据,其数据属性与B中相同。

使用join或contains我可以获得4个值,但是我只能从列表A中获得3个值,因为顺序也是可以修改的,意味着列表B中的3个值必须在列表A中的顺序相同。

因此,列表A中的Id = 6将不予考虑..

请帮助!!!

编辑:

它还应该与ListA中的以下数据一起使用。列表B如上所述。

enter image description here

请参阅更新的问题。

3 个答案:

答案 0 :(得分:1)

您似乎正在尝试在第一个序列中找到第二个序列的子序列。最简单的方法是简单地完成整个第一个序列,采用第二个序列大小的子序列,看看它们是否匹配。

public static IEnumerable<T1> FindSubsequence<T1, T2>(
    this IList<T1> first,
    IList<T2> second,
    Func<T1, T2, bool> matchPredicate)
{
    for (int i = 0; i < first.Count - 1; i++)
    {
        var subsequence = first.Skip(i).Take(second.Count);
        if (subsequence.Zip(second, matchPredicate).All(x => x))
            return subsequence;
    }
    return Enumerable.Empty<T1>();
}

答案 1 :(得分:-1)

我们还有什么理由不能按价值进行比较?这对我有用:

static public void ProcessData(List<ClassA> clsA, List<ClassB> clsB)
    {
        var newlist = (from a in clsA 
                             from b in clsB 
                             where a.data == b.data && a.value == b.value 
                             select a).ToList();
    }

答案 2 :(得分:-1)

除了Hogan建议的内容之外,如果您需要结果作为其中一个类的列表,即ClassA或ClassB,那么您需要执行以下操作:

var result = clsA.Zip(clsB, (a, b) => (a.Id == b.Id && a.Data == b.Data) ? a : b as object);

请注意,您需要将另一个类转换为对象,因为三元运算符不会对不同类型的输出进行操作。

在这里,您将获得ClassA列表作为输出。