【问题标题】:How to find relations between two lists?如何找到两个列表之间的关系?
【发布时间】:2019-06-04 19:29:50
【问题描述】:

我有一个具有两个属性的类的列表。 int Id 和列表键 我需要找到由 Id 表示的键之间的关系。 键列表可以从 1-5 变化,最大长度为 5,而 Id 可以从 1-7 变化。 我需要实现一种方法来找到键和值之间的最高比率。 如果 Id 5 始终链接到包含 3 的键列表,则输出将为 [3,5],即使可能有更多 Id 用键 4 表示 1,因为它们的比率低于 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 1,键 1,总和 4

【问题讨论】:

  • 如果您能提供一个minimal reproducible example,其中包含在代码中定义的示例输入和明确定义的预期结果,那就太棒了。

标签: c# c#-5.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();

【讨论】:

  • 差不多,只需要按Id排序,比如Id 1有3个key 4。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-12
  • 1970-01-01
  • 2016-06-27
  • 2017-07-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多