使用C#Lambda分割字符串和搜索值

时间:2018-04-26 22:21:17

标签: c# linq lambda

我有一个包含以下值的字符串:

0:12211,90:33221,23:09011

在每对中,第一个值(在:(冒号)之前)是雇员ID,后面的第二个值是工资单ID。

因此,如果我想获得员工ID 23的工资单ID,我必须这样做:

var arrayValues=mystring.split(',');

然后为每个arrayValues做同样的事情:

var employeeData = arrayValue.split(':');

这样我就会得到钥匙和价值。

  

有没有办法通过使用lambda来获取给定员工ID的工资核算?

如果employeeId不在字符串中,那么默认情况下它应该返回employeeid 0的payrollid。

5 个答案:

答案 0 :(得分:1)

你可以尝试类似的东西

"0:12211,90:33221,23:09011"
            .Split(new char[] { ',' })
            .Select(c => {
                var pair = c.Split(new char[] { ':' });
                return new KeyValuePair<string, string>(pair[0], pair[1]);
            })
            .ToList();

您必须了解数据的验证

答案 1 :(得分:1)

如果我是你,我会使用字典。特别是如果你要进行多次查找。

Dictionary<int, int> employeeIDToPayrollID = "0:12211,90:33221,23:09011"
    .Split(',') //Split on comma into ["0:12211", "90:33221", "23:09011"]
    .Select(x => x.Split(':')) //Split each string on colon into [ ["0", "12211"]... ]
    .ToDictionary(int.Parse(x => x[0]), int.Parse(x => x[1]))

现在,您只需编写employeeIDtoPayrollID[0]即可获得12211。请注意,如果您的ID不是整数,int.Parse将抛出异常。如果您想要Dictionary<string, string>,可以删除这些来电。

答案 2 :(得分:1)

使用Linq管道和匿名对象:

Additional information: StandardOut has not been redirected or the process hasn't started yet

结果如下:

"0:12211,90:33221,23:09011"
.Split(',')
.Select(x => x.Split(':'))
.Select(x => new { employeeId = x[0], payrollId = x[1] })
.Where(x=> x.employeeId == "23")

这三行代表您的数据处理和投影逻辑:

{
  employeeId = "23",
  payrollId = "09011"
}

然后,您可以在第二个.Split(',') .Select(x => x.Split(':')) .Select(x => new { employeeId = x[0], payrollId = x[1] })

之后添加Where的任何过滤逻辑

答案 3 :(得分:0)

您可以将string.Splitstring.Substring一起使用。

var result = 
      str.Split(',')
         .Where(s => s.Substring(0,s.IndexOf(":",StringComparison.Ordinal)) == "23")
         .Select(s => s.Substring(s.IndexOf(":",StringComparison.Ordinal) + 1))
         .FirstOrDefault();

如果这个逻辑不止一次使用,那么我就把它放到一个方法中:

public string GetPayrollIdByEmployeeId(string source, string employeeId){
    return  source.Split(',')
          .Where(s => s.Substring(0, s.IndexOf(":", StringComparison.Ordinal)) == employeeId)
          .Select(s => s.Substring(s.IndexOf(":", StringComparison.Ordinal) + 1))
          .FirstOrDefault();
}

答案 4 :(得分:0)

假设你在字符串中有三对以上(该字符串有多长?),你可以将它转换为Dictionary并继续使用它。

首先,在逗号上split,然后在冒号上放入Dictionary

var empInfo = src.Split(',').Select(p => p.Split(':')).ToDictionary(pa => pa[0], pa => pa[1]);

现在,您可以编写一个函数来查找员工ID中的工资核算ID:

string LookupPayrollID(Dictionary<string, string> empInfo, string empID) => empInfo.TryGetValue(empID, out var prID) ? prID : empInfo["0"];

你可以打电话来得到答案:

var emp23prid = LookupPayrollID(empInfo, "23");
var emp32prid = LookupPayrollID(empInfo, "32");

如果你在字符串中只有三名雇员,那么创建一个Dictionary可能是过度的,而一个更简单的答案可能是合适的,例如搜索字符串。