如何找到两个列表之间的关系?

How to find relations between two lists?

我有一个 class 的列表,它有两个属性。 int Id 和列表键 我需要找到由 ID 表示的键之间的关系。 键列表可以在 1-5 之间变化,最大长度为 5,而 ID 可以在 1-7 之间变化。 我需要实现一种方法来找到键和值之间的最高比率。 如果 Id 5 始终链接到包含 3 的键列表,则输出将是 [3,5],即使可能有更多的 Id 1 表示键 4,因为它们的比率低于 3 和 5 它们不会被代表。 例如,它可能看起来像这样

Id       Keys

1       [1, 3, 4]
1       [1, 2, 3]
1       [1, 5]
3       [2, 5]
2       [1, 2, 3, 4]
3       [2, 5]
3       [5, 1]
1       [3, 6]
1       [6, 1]

此处 [3,5] 的比率均为 100%,而 2 与 1,2,3 和 4 的比率也为 100%。 输出应该仍然是 3 和 5,因为它们更经常被表示,而比率仍然是 100%。

编辑:只需要 Id 每个键的最高总和,例如:Id 1,键 1,总和 4

尝试以下操作:

            DataTable dt = new DataTable();
            dt.Columns.Add("Id", typeof(int));
            dt.Columns.Add("Keys", typeof(List<int>));

            dt.Rows.Add(new object[] { 1, new List<int>() {1, 3, 4}});
            dt.Rows.Add(new object[] { 1, new List<int>() {1, 2, 3}});
            dt.Rows.Add(new object[] { 1, new List<int>() {1, 5}});
            dt.Rows.Add(new object[] { 3, new List<int>() {2, 5}});
            dt.Rows.Add(new object[] { 4, new List<int>() {1, 2, 3, 4}});
            dt.Rows.Add(new object[] { 3, new List<int>() {2, 5}});
            dt.Rows.Add(new object[] { 3, new List<int>() {5, 1}});
            dt.Rows.Add(new object[] { 1, new List<int>() {3, 6}});
            dt.Rows.Add(new object[] { 1, new List<int>() {6, 1}}); 

            var temp = dt.AsEnumerable()
                .SelectMany(x => x.Field<List<int>>("Keys").Select(y => new {key = y, value = x.Field<int>("Id")}).ToList()).ToList();

            var counts = temp.GroupBy(x => x.key).Select(x => new { key = x.Key, count = x.Count() }).ToList();