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

时间:2019-06-04 10:12:24

标签: c# c#-5.0

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

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的比率。 然后,输出仍应为3加5,因为它们的代表频率更高,而比率仍为100%。

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

1 个答案:

答案 0 :(得分:1)

尝试以下操作:

            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();