使用Object Initializer分割和加入字符串的简单方法?

时间:2015-12-28 01:26:28

标签: c# csv logging

有没有办法缩短下面的代码。 (期望超过20个值)
值将始终保持相同的顺序。

string[] values = line.Split(',');
LogEntry entry = new LogEntry()
{
    Id = values[0],
    Service = values[1],
    Name = values[2],
    Process = values[3],
    type = values[4]
    [...]
};

3 个答案:

答案 0 :(得分:1)

我个人不知道这样做的简化方法 - 这个代码需要存在的地方。但是,您可以使用AutoMapper之类的映射器解决方案来设置映射。至少你的处理程序或操作不会因为赋值逻辑而变得臃肿。

希望这有点帮助。

期待阅读其他答案。

答案 1 :(得分:1)

您可以使用一个参数LogEntry添加到string line构造函数,并将逻辑移到构造函数中。

然后代码看起来像

LogEntry entry = new LogEntry(line);    

在构造函数中是这样的:

public void LogEntry(string line)
{
    string[] values = line.Split(',');
    Id = values[0],
    Service = values[1],
    Name = values[2],
    Process = values[3],
    type = values[4]
    [...]    
}

此代码必须在某处。 是否更好的解决方案取决于具体情况。如果您经常使用对象初始化程序,那将大大简化代码。如果你不这样做可能没什么区别。

答案 2 :(得分:0)

根据您的问题,您正试图避免设置值的那20行。使用如下所示的基于反射的解决方案怎么样?

int retryCount = 0, retryLimit = 5;
while (retryCount < retryLimit) { //repeats the waiting as long as it is within the retry limit
    if (server.Available > 0) //check for the available byte first, please change 0 with number of bytes which you expected
        byteCount = server.Receive(bytes, server.Available, SocketFlags.None); //only read when byte is available
    retryCount++;
    //Log the retry count here if your wish: clsError.LogError("Retry Count: " + retryCount.ToString(), "Retry attempt to get response");
    if (byteCount > 0 && retryCount < retryLimit) //if there is byte received at this point or condition violated, break
        break;
    System.Threading.Thread.Sleep(1000); //no byte received re-check in another second;
}

if (byteCount <= 0) { // no byte received
    clsError.LogError("TestSMS:SendReceiveTest()", "No Acknowledgement recieved");
    return -1; //change this with your own error code
} //passing this point means you receive something