Search code examples
c#linq

To split and store the value accordingly and concatenate the values with special character


Columns = FirstName, LastName, HireDate, MiddleName etc..,

incoming value = Col1$Col2_Col3

These col1, col2, col3 are the column names which will be incoming with special characters added in between. Now this string needs to be split and using linq the value will be replaced from database according to the columns. After the values are received, It needs to be concatenated in the same format with special characters in between and the string will be returned.

Here I have attached a piece of code where I tried to implement the above mentioned problem.

Expected Return value "Rob$Steve_Liam"

public string AutoCredential(string credential, int employeeID)
        {
            Char[] specialChar = { '_', '$', '&' };

            string? format = _itzmeinContext.AppSettings.Where(a => a.AppKey == credential).Select(a => a.AppValue).FirstOrDefault();

            var userTypes = _itzmeinContext.GlobalLookupData.Where(ut => ut.GlobalLookupTableNameId == 7).
                            Select(ut => ut.LookupName).ToList();

            var unFormat = format.Split(specialChar);

            var s = unFormat.Intersect(userTypes);

            string FirstName = null!;
            string MiddleName = null!;
            string LastName = null!;
            string EmailId = null!;
            string PrimaryContactNumber = null!;
            string SecondaryContactNumber = null!;
            string HireDate = null!;

            if (s.Contains("FirstName"))
            {
                FirstName = _smasContext.Users.Where(u => u.UserId == employeeID).Select(u => u.FirstName).FirstOrDefault();
            }
            
            if (s.Contains("MiddleName"))
            {
                MiddleName = _smasContext.Users.Where(u => u.UserId == employeeID).Select(u => u.MiddleName).FirstOrDefault();
            }

            if (s.Contains("LastName"))
            {
                LastName = _smasContext.Users.Where(u => u.UserId == employeeID).Select(u => u.LastName).FirstOrDefault();
            }

            if (s.Contains("EmailId"))
            {
                EmailId = _smasContext.Users.Where(u => u.UserId == employeeID).Select(u => u.EmailId).FirstOrDefault();
            }

            if (s.Contains("PrimaryContactNumber"))
            {
                PrimaryContactNumber = _smasContext.Users.Where(u => u.UserId == employeeID).Select(u => u.PrimaryContactNumber).FirstOrDefault();
            }

            if (s.Contains("SecondaryContactNumber"))
            {
                SecondaryContactNumber = _smasContext.Users.Where(u => u.UserId == employeeID).Select(u => u.SecondaryContactNumber).FirstOrDefault();
            }

            if (s.Contains("HireDate"))
            {
                HireDate = _smasContext.Users.Where(u => u.UserId == employeeID).Select(u => u.HireDate.Date.Year.ToString()).FirstOrDefault();
            }

            string result = string.Concat(FirstName + MiddleName + LastName + EmailId + PrimaryContactNumber + SecondaryContactNumber + HireDate);
            
            return result;
           
        }

Solution

  • Assume that column names,value of each columns are difference so there is no column name and value has the value that will have problems when replace(e.g. like someone has Firstname = "Mr.LastName") you can just use String.Replace

    format = "FirstName$LastName_EmailId";
    //and s is a list of string of extracted needed column names 
    s= {"FirstName", "LastName" ,"EmailId" };
    

    then you go the value you want like this

    var record = _smasContext.Users.Where(u => u.UserId == employeeID).FirstOrDefault();
    
    string firstName = record.FirstName ;
    string lastName = record.LastName ; 
    string emailId = record.EmailId ;
    //... so on
    string xxx= record.XXX;
    string yyy= record.YYY;
    

    then do the if statements to replace value

    string result = format ;
    if(  s.Contains("FirstName ")  ) result  = result.Replace("FirstName",firstName   );
    if(  s.Contains("LastName ")  ) result  = result.Replace("LastName",lastName );
    if(  s.Contains("EmailId ")  ) result  = result.Replace("EmailId",emailId );
    //... so on
    

    of course there are some advance solution like add value to dictionary

    Dictionary<string, string> dicVal= new Dictionary<string, string>();
    dicVal.Add( "FirstName", record.FirstName );  
    dicVal.Add( "LastName", record.LastName);  
    ...
    // use column name as key then add all columns  and values 
    foreach(string colName in s)
    {
      result  = result.Replace(colName  ,dicVal[s]);
    }
    

    Additional reference How to replace part of string by position?