Использование C # Lambda для разделения строки и поиска значения - PullRequest
0 голосов
/ 27 апреля 2018

У меня есть строка со следующим значением:

0:12211,90:33221,23:09011

В каждой паре первое значение (перед : (двоеточие)) является идентификатором сотрудника, второе значение после является идентификатором заработной платы.

Итак, если я хочу получить идентификатор платежной ведомости для сотрудника с идентификатором 23 прямо сейчас, я должен сделать:

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

и затем для каждого arrayValues сделать то же самое:

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

Таким образом, я получу ключ и значение.

Есть ли способ получить идентификатор платежной ведомости по указанному идентификатору сотрудника с помощью лямбды?

Если employeeId отсутствует в строке, то по умолчанию он должен вернуть payrollid для employeeid 0 ноль.

Ответы [ 5 ]

0 голосов
/ 27 апреля 2018

Предполагая, что в строке более трех пар (во всяком случае, какова длина этой строки?), Вы можете преобразовать ее в Dictionary и использовать ее в дальнейшем.

Сначала split на запятой, а затем на двоеточии и введите Dictionary:

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

Теперь вы можете написать функцию для поиска идентификаторов заработной платы по идентификаторам сотрудников:

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, вероятно, является излишним, и может быть уместен более простой ответ, например, поиск строки.

0 голосов
/ 27 апреля 2018

Использование конвейера Linq и анонимных объектов:

"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, после этого вторая Select

0 голосов
/ 27 апреля 2018

Вы можете использовать string.Split вместе с string.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();
}
0 голосов
/ 27 апреля 2018

На вашем месте я бы использовал словарь. Особенно, если вы собираетесь сделать более одного поиска.

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 обратно. Обратите внимание, что int.Parse выдаст исключение, если ваши идентификаторы не являются целыми числами. Вы можете удалить эти звонки, если хотите иметь Dictionary<string, string>.

0 голосов
/ 27 апреля 2018

Вы можете попробовать что-то подобное

"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();

Вы должны быть осведомлены о проверке данных

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...