gpt4 book ai didi

c# - Ruby 中的 LINQ 功能

转载 作者:数据小太阳 更新时间:2023-10-29 08:01:30 26 4
gpt4 key购买 nike

我想用 Ruby 编写一个行为类似于此 C# 代码的代码。

它接收候选拓扑集和世界集,并测试候选拓扑是否是关于世界的拓扑。

在 C# 中使用 LINQ 功能,它看起来像这样:

public static bool IsTopology<T>(IEnumerable<IEnumerable<T>> candidate, IEnumerable<T> world)
{
IEqualityComparer<IEnumerable<T>> setComparer =
new SetComparer<T>();

if (!candidate.Contains(Enumerable.Empty<T>(), setComparer) ||
!candidate.Contains(world, setComparer))
{
return false;
}

var pairs =
from x in candidate
from y in candidate
select new {x,y};

return pairs.All(pair => candidate.Contains(pair.x.Union(pair.y), setComparer) &&
candidate.Contains(pair.x.Intersect(pair.y), setComparer));
}

public class SetComparer<T> : IEqualityComparer<IEnumerable<T>>
{
public bool Equals (IEnumerable<T> x, IEnumerable<T> y)
{
return new HashSet<T>(x).SetEquals(y);
}

public int GetHashCode (IEnumerable<T> obj)
{
return 0;
}
}

我正在寻找的功能如下:

  • 将相等比较器插入方法的能力

  • 使用嵌套映射(和匿名类型)的能力

  • 将数组作为集合进行比较的能力(不是很重要,在 C# 中它缺少一点......)

我相信 ruby​​ 具有这些功能,并且非常有兴趣了解等效代码的外观。

最佳答案

我将您的代码翻译成 ruby​​(并重写了一点):

  # candidate - Enumerable of Enumerable; world - Enumerable; &block - comparer of two sets.
def topology? candidate, world, &block
require 'set'
# you can pass block to this method or if no block passed it will use set comparison
comparer = block || lambda { |ary1,ary2| ary1.to_set.eql?(ary2.to_set) }
# create lambda-function to find a specified set in candidate (to reuse code)
candidate_include = lambda { |to_find| candidate.find {|item| comparer.(item, to_find) } }

return false if( !candidate_include.( []) || !candidate_include.( world) )

pairs = candidate.to_a.repeated_permutation(2)

pairs.all? do |x,y| x_set = x.to_set; y_set = y.to_set
candidate_include.(x_set & y_set) && # or x_set.intersection y_set
candidate_include.(x_set | y_set) # or x_set.union y_set
end
end

希望对你有帮助

关于c# - Ruby 中的 LINQ 功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8070389/

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