c#-平衡图
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c#-平衡图,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1517字,纯文字阅读大概需要3分钟。
内容图文
我有一组看起来像这样的边缘:
public class Edge<T>
{
public T From { get; set; }
public T To { get; set; }
}
现在,我想检查一下我的图形是否平衡.在“平衡”下,我的意思是任何顶点的入站和出站边数均相等.我当前的代码是:
public static bool IsGraphBalanced<T>(List<Edge<T>> edges)
{
var from = new Dictionary<T, int>);
var to = new Dictionary<T, int>);
foreach (var edge in edges)
{
if (!from.ContainsKey(edge.From))
from.Add(edge.From, 0);
if (!to.ContainsKey(edge.To))
to.Add(edge.To, 0);
from[edge.From] += 1;
to[edge.To] += 1;
}
foreach (var kv in from)
{
if (!to.ContainsKey(kv.Key))
return false;
if (to[kv.Key] != kv.Value)
return false;
}
// mirrored check with foreach on "to" dictionary
return true;
}
我可以用Linq代替吗?
附言边缘的大小在100-150个项目以下,所以我关心的是可读性而不是性能
解决方法:
这是一个使用Enumerable类ToLookup、All、Count和Any扩展方法的更简洁的实现(我让您决定它是否更具可读性):
public static bool IsGraphBalanced<T>(List<Edge<T>> edges)
{
var from = edges.ToLookup(e => e.From);
var to = edges.ToLookup(e => e.To);
return from.All(g => g.Count() == to[g.Key].Count())
&& to.All(g => from[g.Key].Any());
}
ToLookup方法类似于GroupBy,但是创建可重用的数据结构(因为我们需要2次传递).
然后from.All(g => g.Count()== to [g.Key] .Count())检查每个From是否具有对应的To,并且它们的计数是否匹配.注意,如果密钥不存在,则ILookup< TKey,TElement>索引器不会抛出异常或返回null,而是返回一个空的IEnumerable< TElement> ;,这使我们能够组合检查. 最后,to.All(g => from [g.Key] .Any())检查每个To是否具有对应的From.此处无需检查计数,因为它们已在上一步中检查过.
内容总结
以上是互联网集市为您收集整理的c#-平衡图全部内容,希望文章能够帮你解决c#-平衡图所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。