我想使用以下条件修剪它 一个item如果存在itemLarger != item,应该从字典中删除在字典中这样 item.Value.Union(new[] { it-6ren">
gpt4 book ai didi

c# - 如何根据 "is-subset"条件有效地修剪列表?

转载 作者:行者123 更新时间:2023-11-30 17:16:01 28 4
gpt4 key购买 nike

假设我得到 Dictionary<int, List<int>>我想使用以下条件修剪它

  • 一个item如果存在itemLarger != item,应该从字典中删除在字典中这样 item.Value.Union(new[] { item.Key })itemLarger.Value.Union(new[] { itemLarger.Key }) 的子集

也就是说,字典中的每个项目都将由一个数字列表表示,该列表是通过将项目的键附加到项目的值而获得的,我想摆脱那些由其他项目表示的子集表示的项目。

例子:

var testResult = new Dictionary<int, List<int>>
{
{ 2, new[] { 3, 4 }},
{ 3, new[] { 2, 4 }},
{ 1, new[] { 2, 3, 4 }},
{ 4, new[] { 2, 3 }}
};

在这种情况下,列表中唯一剩下的元素将是 {1, {2, 3, 4}}

我似乎找不到一些优雅的方法来做到这一点,因为

  • GroupBy当我有两个应该分组时,不允许我指定具体应该将哪个元素用作键
  • Distinct不允许我指定,以防两个元素不同,哪些应该保留在列表中

当然,它可以通过简单的方式实现。不知道有没有好看的。

感谢您的任何想法。

最佳答案

我认为这与您所说的“琐碎”方式没有太大区别,但这是一个 LINQ 解决方案:

var sets = testResult
.Select(x => new { Key = x.Key, Set = new HashSet<int>(x.Value.Concat(new[] { x.Key })) })
.ToList();
var res = sets.Where(s => sets.Any(x => x.Set.IsSupersetOf(s.Set) && x.Key != s.Key));
var keysToRemove = res.Select(x => x.Key);

关于c# - 如何根据 "is-subset"条件有效地修剪列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7581808/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com