Как найти отношения между двумя списками? - PullRequest
0 голосов
/ 04 июня 2019

У меня есть список класса, который имеет два свойства. int Id и список ключей Мне нужно найти отношения между ключами, представленными идентификаторами. Список ключей может варьироваться от 1 до 5 с максимальной длиной 5, а идентификаторы могут варьироваться от 1 до 7. Мне нужно реализовать способ найти максимальное соотношение между ключом и значением. Если Id 5 всегда связан со списком ключей, которые содержат 3, вывод будет [3,5], даже при том, что может быть больше идентификаторов с 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. Выходные данные должны тогда быть 3 с 5, потому что они представлены чаще, в то время как соотношение все еще составляет 100%.

Редактировать: просто нужно наибольшую сумму для каждого ключа по Id, например: Id 1, ключ 1, сумма 4

1 Ответ

1 голос
/ 04 июня 2019

Попробуйте следующее:

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