从 java 转换为 c#

本文关键字:转换 java | 更新日期: 2023-09-27 18:35:22

我需要你的帮助。我正在从java转换为c#,但我遇到了障碍。我正在寻找 java 枚举类的 c# 等效项。我已经浏览了 C# 枚举文档,但我无法找到反映 java 版本的东西,尤其是当涉及到我需要的太多方法时,这些就是枚举。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

感谢您的帮助

从 java 转换为 c#

Enumeration<E>上的方法看起来与 C# 中的 IEnumerator<T> 接口实现的目的类似,但语义略有不同。例如,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>进行objStructureHT

    foreach (string strFieldName in objStructureHT.Keys){

但是,您甚至获得Keys的唯一原因是您可以查找每个并获取其价值,对吗?所以有一个更好的方法:

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

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

这一切有意义吗?

基于此,枚举已被弃用,新的迭代器接口应该在 Java 中使用。另一方面,在 C# 中,自第一个版本以来一直在使用一个名为 IEnumerator 的接口。后来,引入了通用IEnumerator。所有这些接口的作用都是实现迭代器模式。

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

IEnumerator 通常与 IEnumerable 接口和 foreach 关键字结合使用。

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

更新好了,脱衣舞战士的回答结束了讨论。