我对C#非常熟悉,但开始在Java中工作更多.我希望得知Java中的枚举基本上与C#中的枚举相同,但显然情况并非如此.最初,我很高兴得知Java枚举可能包含多个数据,这似乎非常有利(http://docs.oracle.com/javase/tutorial/java/javaOO/enum.html).但是,从那时起我发现C#中缺少许多功能,例如能够轻松地为枚举元素分配特定值,以及因此无需花费大量精力就能将整数转换为枚举(即整数值转换为相匹配的Java枚举).
所以我的问题是:对于带有一堆公共静态最终字段的类,Java枚举是否有任何好处?或者它只提供更紧凑的语法?
编辑:让我更清楚.Java枚举对于具有相同类型的一组公共静态最终字段的类有什么好处?例如,在第一个链接的行星示例中,枚举对具有这些公共常量的类有什么好处:
public static final Planet MERCURY = new Planet(3.303e+23, 2.4397e6);
public static final Planet VENUS = new Planet(4.869e+24, 6.0518e6);
public static final Planet EARTH = new Planet(5.976e+24, 6.37814e6);
public static final Planet MARS = new Planet(6.421e+23, 3.3972e6);
public static final Planet JUPITER = new Planet(1.9e+27, 7.1492e7);
public static final Planet SATURN = new Planet(5.688e+26, 6.0268e7);
public static final Planet URANUS = new Planet(8.686e+25, 2.5559e7);
public static final Planet NEPTUNE = …
Run Code Online (Sandbox Code Playgroud) 我试图确定HashSet
.NET 3.5(C#)中的两个对象是否是相等的集合,即包含相同的值.这似乎是人们显然想做的事情,但是所提供的功能似乎都没有给你这些信息.
我能想到这样做的方法是检查两组的计数是否相等,一组是另一组的子集(不合适).我认为唯一可能发生的方法是它们是否相同.示例代码:
HashSet<int> set1 = new HashSet<int>();
set1.Add(1);
set1.Add(2);
set1.Add(3);
HashSet<int> set2 = new HashSet<int>();
set2.Add(1);
set2.Add(2);
set2.Add(3);
if(set1.Count == set2.Count && set1.IsSubsetOf(set2))
{
// do something
}
Run Code Online (Sandbox Code Playgroud)
这会一直有效吗?有没有更好的办法?为什么不HashSet
具有 public bool IsEqualSetWith()
的功能?
我正在使用BinaryFormatter
C#中的某些对象进行二进制序列化.但是,某些对象包含我通过DLL访问但没有源代码的类,因此我无法使用该Serializable
属性标记它们.是否有一种简单的方法来序列化它们?我有一个解决方法,涉及获取类NoSource
和创建一个新类SerializableNoSource
,构造函数接受一个NoSource
对象,并从中提取我需要的所有信息,但它是hacky.还有更好的选择吗?
我正在使用XSLT将XML转换为HTML.我无法弄清楚如何处理嵌入式XML节点的格式化.例如,假设我有XML元素:
<favoriteMovie>the <i>Star Wars</i> saga</favoriteMovie>
但是,在XLST期间,<i>
标记会被忽略,因此"星球大战"在HTML输出中不是斜体.是否有一种相对简单的方法来解决这个问题?
的test.xml:
<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="test.html.xsl"?>
<favoriteMovies>
<favoriteMovie>the <i>Star Wars</i> saga</favoriteMovie>
</favoriteMovies>
Run Code Online (Sandbox Code Playgroud)
test.html.xsl:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" omit-xml-declaration="yes" />
<xsl:template match="/">
<html>
<head />
<body>
<ul>
<xsl:for-each select="favoriteMovies/favoriteMovie">
<li><xsl:value-of select="." /></li>
</xsl:for-each>
</ul>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
Run Code Online (Sandbox Code Playgroud) 我有约束的非线性优化问题.它可以使用Solver加载项在Microsoft Excel中解决,但我无法在C#中复制它.
我的问题显示在以下电子表格中.我正在解决经典的A x = b问题,但需要注意的是x的所有分量都必须是非负的.因此,不使用标准线性代数,而是使用具有非负约束的Solver,最小化平方差的总和,并获得合理的解.我试图使用Microsoft Solver Foundation或Solver SDK在C#中复制它.然而,我似乎无法与他们在任何地方,因为有了MSF,我无法弄清楚如何定义目标和使用Solver SDK我总是回到状态"最佳"和所有0的解决方案,这绝对不是一个本地最小.
这是我的Solver SDK代码:
static double[][] A = new double[][] { new double[] { 1, 0, 0, 0, 0 }, new double[] { 0.760652602, 1, 0, 0, 0 }, new double[] { 0.373419404, 0.760537565, 1, 0, 0 }, new double[] { 0.136996731, 0.373331934, 0.760422587, 1, 0 }, new double[] { 0.040625222, 0.136953801, 0.373244464, 0.76030755, 1 } };
static double[][] b = new …
Run Code Online (Sandbox Code Playgroud) 据我所知,二维数组在内存中的布局与一维数组完全相同,只是使用不同的索引.所以考虑到这一点,似乎在C#中必须有某种方式(可能是不安全的)将1-D数组转换为2-D数组而不实际复制元素,假设您希望将1-D数组中的元素转换为第一行中的二维数组.我确实弄清楚如何使用单个复制命令完成此操作,但它似乎仍然需要更多处理:
int[] onedim = new int[] { 5, 3, 6, 2, 1, 5 };
int[,] twodim = new int[2, 3];
GCHandle pinnedArray = GCHandle.Alloc(twodim, GCHandleType.Pinned);
IntPtr pointer = pinnedArray.AddrOfPinnedObject();
Marshal.Copy(onedim, 0, pointer, onedim.Length);
pinnedArray.Free();
Run Code Online (Sandbox Code Playgroud)
有什么方法可以告诉C#,将这个1-D阵列视为具有这些尺寸的2-D阵列?不安全的代码很好.如果没有,这是语言的限制还是我缺少一些基本问题?
我的问题标题解释了这一切.这非常令人沮丧,尤其是在处理大量类似常量时.它适用于Visual Basic项目,但不适用于Visual C#.
一般来说,为什么IDE对于不同的语言似乎是如此不同(例如VB中的超级智能感知而不是C#中的智能感知)?对我来说,让两个不同的团队为两种主要.NET语言的IDE工作是没有意义的......
我正在使用C#读取~120 MB纯文本CSV文件.最初我通过逐行读取来进行解析,但最近确定首先将整个文件内容读入内存的速度要快几倍.解析已经非常慢了,因为CSV在引号中嵌入了逗号,这意味着我必须使用正则表达式拆分.这是我发现的唯一可靠的工作方式:
string[] fields = Regex.Split(line,
@",(?!(?<=(?:^|,)\s*\x22(?:[^\x22]|\x22\x22|\\\x22)*,)
(?:[^\x22]|\x22\x22|\\\x22)*\x22\s*(?:,|$))");
// from http://regexlib.com/REDetails.aspx?regexp_id=621
Run Code Online (Sandbox Code Playgroud)
为了在将整个内容读入内存后进行解析,我在换行符上进行字符串拆分以获得包含每一行的数组.但是,当我在120 MB文件上执行此操作时,我得到了一个System.OutOfMemoryException
.当我的计算机有4 GB RAM时,为什么内存耗尽?有没有更好的方法来快速解析复杂的CSV?
我想使用List.BinarySearch()
自定义项类型.自定义类型未实现IComparable<T>
; 相反,我有几个静态Comparison<T>
函数,我打电话,因为在不同的点我想按不同的标准对列表进行排序.另外,我认为它增加了清晰度,因为您的排序方式可以通过函数名称来描述.现在我想在列表上进行二进制搜索.我想使用我的一个比较函数,List.BinarySearch()
但却发现它没有Comparison<T>
只接受的重载IComparer<T>
.我试图避免,IComparer<T>
因为对于我来说,只是为了比较对象而有一个单独的类似乎很愚蠢.为什么不List.BinarySearch()
有采取过载Comparison<T>
,除了IComparer<T>
?有没有办法使用我现有的Comparison<T>
功能List.BinarySearch()
?