c# - 如何在 C# 中优雅地搜索结构数组,从 C++ 移植?

标签 c# c++ arrays struct

我有一些要用 C# 重写的 C++ 代码。我很擅长 C++,但对 C# 还是陌生的,所以尽管我的 C# 代码运行良好,但我不禁想到有一种更优雅的方法来实现这一点。

这是转换后的 C# 代码 - 原始 C++ 代码如下:

public partial class NativeConstants
{
    public const uint ID_50PS = 0;  // 50 per second (20ms)
    public const uint ID_20PS = 1;  // 20 per second (50ms)
    public const uint ID_10PS = 2;  // 10 per second (100ms)
    public const uint ID_5PS = 3;  // 5 per second (200ms)
    public const uint ID_2PS = 4;  // 2 per second (500ms)
    public const uint ID_1S = 5;
    public const uint ID_2S = 6;
    public const uint ID_5S = 7;
    public const uint ID_10S = 8;
    public const uint ID_15S = 9;
    public const uint ID_20S = 10;
    public const uint ID_30S = 11;
    public const uint ID_1MIN = 12;
    public const uint ID_2MIN = 13;
    public const uint ID_5MIN = 14;
    public const uint ID_10MIN = 15;
    public const uint ID_15MIN = 16;
    public const uint ID_20MIN = 17;
    public const uint ID_30MIN = 18;
    public const uint ID_1HR = 19;
    public const uint ID_24HR = 20;
    public const uint ID_400PS = 21; // 400 per second (2.5ms)
    public const uint ID_200PS = 22; // 200 per second (5ms)
    public const uint ID_100PS = 23; // 100 per second (10ms)
}

struct SPeriodInfo
{
    public string   strItem;
    public int      nItemData;
    public float    fPeriod;

    public SPeriodInfo(string item, int itemData, float period)
    {
        strItem = item;
        nItemData = itemData;
        fPeriod = period;
    }
}
static readonly SPeriodInfo[] PeriodInfo = new SPeriodInfo[]
{
    new SPeriodInfo("20 ms",  NativeConstants.ID_50PS, (float)0.020),
    new SPeriodInfo("50 ms",  NativeConstants.ID_20PS, (float)0.050),
    new SPeriodInfo("100 ms", NativeConstants.ID_10PS, (float)0.100),
    new SPeriodInfo("200 ms", NativeConstants.ID_5PS, (float)0.200),
    new SPeriodInfo("500 ms", NativeConstants.ID_2PS, (float)0.500),
    new SPeriodInfo("1 sec",  NativeConstants.ID_1S, (float)1.0),
    new SPeriodInfo("2 sec",  NativeConstants.ID_2S, (float)2.0),
    new SPeriodInfo("5 sec",  NativeConstants.ID_5S, (float)5.0),
    new SPeriodInfo("10 sec", NativeConstants.ID_10S, (float)10.0),
    new SPeriodInfo("15 sec", NativeConstants.ID_15S, (float)15.0),
    new SPeriodInfo("20 sec", NativeConstants.ID_20S, (float)20.0),
    new SPeriodInfo("30 sec", NativeConstants.ID_30S, (float)30.0),
    new SPeriodInfo("1 min",  NativeConstants.ID_1MIN, (float)60.0),
};

float fPeriod = 0;
for (int i = 0; i < PeriodInfo.Count(); ++i)
{
    if (PeriodInfo[i].nItemData == slmRecordData.m_Settings.m_nSamplePeriod)
    {
        fPeriod = PeriodInfo[i].fPeriod;
        break;
    }
}

这是原始的 C++ 代码:

#define ID_50PS                        0  // 50 per second (20ms)
#define ID_20PS                        1  // 20 per second (50ms)
#define ID_10PS                        2  // 10 per second (100ms)
#define ID_5PS                         3  // 5 per second (200ms)
#define ID_2PS                         4  // 2 per second (500ms)
#define ID_1S                          5
#define ID_2S                          6
#define ID_5S                          7
#define ID_10S                         8
#define ID_15S                         9
#define ID_20S                         10
#define ID_30S                         11
#define ID_1MIN                        12
#define ID_2MIN                        13
#define ID_5MIN                        14
#define ID_10MIN                       15
#define ID_15MIN                       16
#define ID_20MIN                       17
#define ID_30MIN                       18
#define ID_1HR                         19
#define ID_24HR                        20
#define ID_400PS                       21 // 400 per second (2.5ms)
#define ID_200PS                       22 // 200 per second (5ms)
#define ID_100PS                       23 // 100 per second (10ms)

typedef struct
{
    std::wstring    wstrItem;
    int             nItemData;
    float           fPeriod;
} SPeriodInfo;

SPeriodInfo PeriodInfo [] =
{
    {L"20 ms",  ID_50PS, (float)0.020},
    {L"50 ms",  ID_20PS, (float)0.050},
    {L"100 ms", ID_10PS, (float)0.100},
    {L"200 ms", ID_5PS, (float)0.200},
    {L"500 ms", ID_2PS, (float)0.500},
    {L"1 sec",  ID_1S, (float)1.0},
    {L"2 sec",  ID_2S, (float)2.0},
    {L"5 sec",  ID_5S, (float)5.0},
    {L"10 sec", ID_10S, (float)10.0},
    {L"15 sec", ID_15S, (float)15.0},
    {L"20 sec", ID_20S, (float)20.0},
    {L"30 sec", ID_30S, (float)30.0},
    {L"1 min",  ID_1MIN, (float)60.0},
};

float fPeriod = 0;
for (int i = 0; i < _countof(PeriodInfo); ++i)
{
    if (PeriodInfo[i].nItemData == slmRecordData.m_Settings.m_nSamplePeriod)
    {
        fPeriod = PeriodInfo[i].fPeriod;
        break;
    }
}

最佳答案

1) 使用自动属性,并为 SPeriodInfo ( class and struct have very different semantics in C# ) 使用 class

class SPeriodInfo
{
    public string   strItem   { get; private set; }
    public int      nItemData { get; private set; }
    public float    fPeriod   { get; private set; }

    public SPeriodInfo(string item, int itemData, float period)
    {
        strItem = item;
        nItemData = itemData;
        fPeriod = period;
    }
}

2) 不要用手写循环搜索句号,可以用Array.FindLinq :

float fPeriod = Array.Find(PeriodInfo,
    element => element.nItemData == slmRecordData.m_Settings.m_nSamplePeriod);

或者

float fPeriod = PeriodInfo.FirstOrDefault(p=>p.nItemData == slmRecordData.m_Settings.m_nSamplePeriod).fPeri‌​od;

关于c# - 如何在 C# 中优雅地搜索结构数组,从 C++ 移植?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27082663/

相关文章:

c++ - 将 std::chrono::system_clock::time_point 转换为 struct timeval 并返回

c - 传递一维数组、二维数组和指针数组

javascript - 递归是跳过值

c# - 改进从 xml 文件中获取数据

c# - 就地删除出现多次的 List<T> 元素

c++ - stringstream 可以在读取原语时抛出异常吗?

javascript - 在 JavaScript 中,如何将多个数组转换为 HTML 表并在 for 循环 JSON 对象时打印它们

c# - 动画网格从一个位置到另一个

c# - NetworkStream.DataAvailable 更新缓慢

c++ - 朗伯阴影和阴影(光线追踪)的问题