我有一个具有两个属性的类的列表。整数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
答案 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();