-4

我想比较 2 个数组列表。让我们以这个例子为例:

 List<int[]> list1 = new List<int[]>() { new int[4] { 1, 2, 3, 4 }, new int[4] { 1, 2, 3, 5 } };
 List<int[]> list2 = new List<int[]>() { new int[2] { 1, 2 }, new int[2] { 3, 4 }, new int[2] { 3, 5 } };

我想知道 list1 中的每个元素来计算 list 2 中的每个元素它们有多少共同元素。

前任。1,2,3,4 与 1,2 相比将产生 2 个匹配元素。1,2,3,4 与 3,5 相比将产生 1 个匹配元素。

这不是重复的,因为我不想比较常规列表。我希望查看 list1 中的每条记录 list2 中有多少项目包含多少常见项目。

4

5 回答 5

1
List<int[]> list1 = new List<int[]>() { new int[4] { 1, 2, 3, 4 }, new int[4] { 1, 2, 3, 5 } };
List<int[]> list2 = new List<int[]>() { new int[2] { 1, 2 }, new int[2] { 3, 4 }, new int[2] { 3, 5 } };

var results = list1.Select(x => list2.Select(y => y.Intersect(x).Count()).ToList()).ToList();

Result contains following data: [ [ 2, 2, 1 ], [ 2, 1, 2 ] ]

于 2013-07-11T06:22:11.013 回答
1

您可以使用Enumerable.Intersect找出第二个列表中第一个的常见项目。

var commonList = list1.Intersect(list2);

两个集合 A 和 B 的交集定义为包含 A 的所有也出现在 B 中的元素,但不包含其他元素的集合

编辑由于您将数组作为列表元素,因此您必须遍历每个列表项。

 List<int[]> list1 = new List<int[]>() { new int[4] { 1, 2, 3, 4 }, new int[4] { 1, 2, 3, 5 } };
 List<int[]> list2 = new List<int[]>() { new int[2] { 1, 2 }, new int[2] { 3, 4 }, new int[2] { 3, 5 } };
 List<int[]> list3 = new List<int[]>();
 for (int i = 0; i < list1.Count; i++)
 {
    list3.Add(list1[i].Intersect(list2[i]).ToArray()); 
 }
于 2013-07-11T06:09:23.223 回答
0

你会做这样的事情:

var results = 
    from x in list1.Select((array, index) => new { array, index })
    from y in list2.Select((array, index) => new { array, index })
    select new 
    {
        list1_index = x.index,
        list2_index = y.index,
        count = x.array.Intersect(y.array).Count()
    };

foreach(var r in results)
{
    Console.WriteLine("({0}, {1}) have {2} item(s) in common.", r.list1_index, r.list2_index, r.count);
}
// (0, 0) have 2 item(s) in common.
// (0, 1) have 2 item(s) in common.
// (0, 2) have 1 item(s) in common.
// (1, 0) have 2 item(s) in common.
// (1, 1) have 1 item(s) in common.
// (1, 2) have 2 item(s) in common.
于 2013-07-11T06:10:37.533 回答
0

根据您的要求,我认为在 C# 中,列表中没有这样的 inbuild 函数可以完全满足您的要求,但以下函数会完全返回您在 resultList 中所需的功能。希望这对您有所帮助。

    private List<int> MatchList()
    {
        List<int[]> list1 = new List<int[]>() { new int[4] { 1, 2, 3, 4 }, new int[4] { 1, 2, 3, 5 } };
        List<int[]> list2 = new List<int[]>() { new int[2] { 1, 2 }, new int[2] { 3, 4 }, new int[2] { 3, 5 } };
        List<int> resultList = new List<int>();

        for (int i = 0; i < list1.Count; i++)
        {
            for (int j = 0; j < list2.Count; j++)
            {
                if (i == j)
                {
                    int result = 0;

                    foreach (int list1Element in list1[i])
                    {
                        foreach (int list2Element in list2[j])
                        {
                            if (list1Element == list2Element)
                            {
                                result +=1;
                            }
                        }
                    }

                    resultList.Add(result);
                }
            }
        }
        return resultList;
    }
于 2013-07-11T06:43:50.170 回答
0
var commons = list1.Select(x => list2.Select(x.Intersect).ToArray()).ToArray();

Console.WriteLine(commons[0][0]); // Commons between list1[0] and list2[0]
Console.WriteLine(commons[0][1]); // Commons between list1[0] and list2[1]
Console.WriteLine(commons[3][0]); // Commons between list1[3] and list2[0]

Console.WriteLine(commons[3][0].Length); // Number of commons between [3] and [0]
于 2013-07-11T06:12:12.710 回答