【发布时间】:2014-12-06 13:13:26
【问题描述】:
场景
我正在使用带有FlagsAttribute 集合的Enum,对于这个问题,我将以System.IO.FileAttributes 枚举为例。
给出一个值,我想得到Enum 中最接近的值,包括标志组合。
例如给出值 10,上面枚举中最接近的值是 4,即FileAttributes.System。
但如果我们包含标志组合,那么最接近的值应该是 7,即FileAttributes.ReadOnly, FileAttributes.Hidden, FileAttributes.System。
问题
我不假装重新发明轮子,我只是想改进它以考虑可能的标志组合。
那么,在 C# 或 VB.Net 中,我如何编写一种“Get Nearest enum flags-combination”函数?
代码
这是我通常用来获取Enum 的最接近值的方法,这不考虑标志组合。
我已经编写了这个函数,期望它适用于短/ushort/integer/uinteger/long/ulong 枚举,但到那时我还没有在所有场景中测试它。
VB.Net:
''' <summary>
''' Gets the nearest value of an <see cref="T:Enum"/>.
''' </summary>
Private Function GetNearestEnumValue(Of T)(ByVal value As Long) As T
Return (From enumValue As T
In [Enum].GetValues(GetType(T)).Cast(Of T)()
Order By Math.Abs(value - Convert.ToInt64(enumValue))
).First
End Function
C#在线翻译:
/// <summary>
/// Gets the nearest value of an <see cref="T:Enum"/>.
/// </summary>
private T GetNearestEnumValue<T>(long value)
{
return (from enumValue in Enum.GetValues(typeof(T)).Cast<T>()orderby Math.Abs(value - Convert.ToInt64(enumValue))).First;
}
//=======================================================
//Service provided by Telerik (www.telerik.com)
//=======================================================
【问题讨论】:
-
10 来自哪里,您想将其用作 FileAttr 但它并不代表实际的标志组合?
-
10是传递给我想做的函数的虚值:GetNearestValue(Of FileAttributes)(10) -
有什么特别的理由在此处包含自动 C# 翻译吗?这似乎......不合适。
-
该问题被标记为 C# 和 Vb.Net,因此它似乎并不过分,因为一个好的问题必须证明以指定语言给出代码示例的进度,然后有是代码示例。此外,许多人反对或歧视带有 C# 标记的 VB 问题只是因为他们不理解 Vb.Net 问题与 C# 有关,那么代码示例也是为了避免那些人推理。对不起我的英语。
-
我知道函数是如何工作的。让我换一种方式问:值 8202 的期望答案是什么?