-5

我需要你的帮助。我正在从 java 转换为 c#,但遇到了障碍。我正在寻找相当于java Enumeration 类的ac#。我浏览了 C# Enumeration 文档,但无法找到反映 java 版本的内容,尤其是当涉及到我需要的太多方法时,这些是 Enumeration。hasMoreElements() 和 Enumeration.nextElement()。

protected boolean populateResultSetDataToRRX(Hashtable objStructureHT,String strObjectName  ,String strMultiUserCheck)
{
    try{
        Enumeration objEnum = null;
        for (objEnum=objStructureHT.keys(); objEnum.hasMoreElements();){
            String strFieldName = (String)objEnum.nextElement();
            String strBindFieldName=extractBindField(strFieldName).toUpperCase();
            String strDataType = (String)objStructureHT.get(strFieldName);
            String strFieldValue="";
            if(strDataType.equals("date")){
                if(objResultSet.getTimestamp(strBindFieldName)==null)
                    strFieldValue="";
                else
                    strFieldValue = objResultSet.getTimestamp(strBindFieldName).toString();
            }else {
                strFieldValue = objResultSet.getString(strBindFieldName);
            }
            if(!populateRRXField(strObjectName,strFieldName,strFieldValue,strDataType)){
                return false;
            }
        }// end of for objEnum hasNoMoreElements
        if (strMultiUserCheck.equalsIgnoreCase("Token")) {
            objRRX.addField(strObjectName,"Token",
                objResultSet.getString("Token"));
        }
        objRRX.addField(strObjectName,"selected","N");
        objRRX.assignErrorStatus(strObjectName, strStatus, "SUCCESS");
        return true;
    }
    catch(Exception e)
    {
        System.out.println("Exception in populateResultSetDataToRRX " + e.getMessage());
        return false;
    }
}// end of function populateResultSetDataToRRX

谢谢你的帮助

4

2 回答 2

5

上面的方法Enumeration<E>看起来与IEnumerator<T>C# 中的接口实现了相似的目的,但语义略有不同。例如,该MoveNext()方法实现了两个目的:它移动到下一个元素返回一个布尔值来告诉您是否有下一个元素要移动到。

但我发现你不太可能真的需要这个界面。你能分享更多关于你想要达到的目标的细节吗?通常可以编写比直接转换更好的 C# 代码。

更新

确认!我的眼睛!好的,所以这首先是过时的(或者只是做得不好)Java 代码。代替:

    Enumeration objEnum = null;
    for (objEnum=objStructureHT.keys(); objEnum.hasMoreElements();){
        String strFieldName = (String)objEnum.nextElement();

它应该是:

    for (String strFieldName : objStructureHT.keys()){

在 C# 中可以很好地转换为(假设您使用的是Dictionary<string, string>for objStructureHT

    foreach (string strFieldName in objStructureHT.Keys){

然而,你甚至得到的唯一原因Keys是你可以查找每一个并获得它的价值,对吧?所以有一个更好的方法:

    foreach (var pair in objStructureHT){
        string strFieldName = pair.Key;
        string strDataType = pair.Value;
        ...

...这让人想知道为什么我们甚至使用 aDictionary而不是具有FieldNameDataType属性的类。但这超出了这个问题的范围。

这一切有意义吗?

于 2013-10-15T15:35:18.310 回答
2

基于枚举是一种弃用,新的​​迭代器接口应该在 Java 中使用。另一方面,在 C# 中,从第一个版本开始就使用了一个名为IEnumerator的接口。后来,引入了泛型IEnumerator<T>。所有这些接口的作用都是实现迭代器模式

与 Java 版本相比,C# 没有单独的hasMoreElements()nextElement()方法。它们都统一到MoveNext()方法中,该方法在成功迭代步骤时返回true ,一旦没有更多元素可迭代,则返回false 。从 C# 语言的 2.0 版本开始,就有了yield关键字,它指示编译器生成接口的正确实现,并且对于简单的情况非常有用。

IEnumerator通常与IEnumerable接口和foreach关键字一起使用。

您可以在此处此处此处阅读更多内容。

更新 OK,StriplingWarrior 的回答结束了讨论。

于 2013-10-15T16:03:20.407 回答