2015-03-10 4 views
2

У меня есть подобный код,Как мы можем сопоставить строку с регистром, чувствительным к регистру?

string firstLineOfRecord = "front images,Currency Code,Date,BackImages,Domination"; 
string[] fieldArrayRecord = firstLineOfRecord.Split(','); 

string fields = "FrontImages,BackImages,Domination,CurrencyCode,SerialNumber"; 
string[] fieldArrayList = fields.Split(','); 
List<int> mappedList = new List<int>(); 

for (int i = 0; i< fieldArrayList.Count(); i++) 
{ 
    for (int j = 0; j < fieldArrayRecord.Count(); j++) 
    { 
     if (fieldArrayList[i] == fieldArrayRecord[j]) 
     { 
      mappedList.Add(j); 
     } 
    } 
} 

Как я могу карты, «передние изображения» с «FrontImages».

Как я начинаю знать, я не знаю, как решить эту проблему. Расскажите мне, как этого добиться.

+0

No.The "firstLineOfRecord" от сервера. он может содержать любую ценность. что я должен делать в этом случае? –

+0

Отображенный список должен содержать индексы всех найденных совпадений? –

+0

Вы должны объяснить проблему более подробно. Похоже, вы пытаетесь сравнить текст элементов в первом массиве, чтобы найти индекс во втором, это правильно? – Sayse

ответ

1

Как я понял из вашего вопроса, ваши проблемы пространства и чувствительность к регистру , так что вы можете использовать

fieldArrayList[i].Replace(" ","").ToLower() == 
    fieldArrayRecord[j].Replace(" ","").ToLower() 
+1

[Никогда не используйте 'ToLower' для сравнения строк!] (Http: /stackoverflow.com/a/1660232/993547) –

+0

Вы правы, я согласен на ваш комментарий. Но он попросил только одно уравнение, поэтому я дал этот ответ просто. Если бы он попросил более общее решение, я бы никогда этого не дал. – ercyon

+0

Простой 'string.Equals' будет хорошо. –

2

Для такого нечеткого совпадения сначала необходимо определить действительные идентификаторы для игнорирования (в данном случае пробела).

Вы можете сделать что-то вроде этого: вы удаляете все эти идентификаторы. Затем сравните регистр и нечувствительность к культуре.

string normalizedHeaderString = "FrontImages"; 
string normalizedInputString = "front images"; 

foreach (string c in new[] { " " }) /* the strings to strip out */ 
{ 
    normalizedHeaderString = normalizedHeaderString.Replace(c, null); 
    normalizedInputString = normalizedInputString.Replace(c, null); 
} 

if (string.Equals(normalizedHeaderString 
       , normalizedInputString 
       , StringComparison.OrdinalIgnoreCase 
       ) 
    ) 
{ /* do your logic, like saving the index, etc */ } 

Это немного взломанный, но вы поняли идею. Вам лучше использовать пользовательскую реализацию StringComparer, которая просто игнорирует символы, которые нужно вычеркнуть.

-1

Вот способ сделать это с помощью запроса LINQ:

string firstLineOfRecord = "front images,Currency Code,Date,BackImages,Domination"; 

string[] fieldArrayRecord = firstLineOfRecord.Split(',') 
              .Select(x => x.Replace(" ", string.Empty)) 
              .ToArray(); 
// Test it, prints True. 
fieldArrayRecord.Contains("FrontImages", StringComparer.OrdinalIgnoreCase) 

Примечание это заменит любое пробел между этими буквами и изменит данный fieldArrayRecord.

1
class Program 
{ 
    static void Main(string[] args) 
    { 
     string firstLineOfRecord = "front images,Currency Code,Date,BackImages,Domination"; 
     string[] fieldArrayRecord = firstLineOfRecord.Split(','); 

     string fields = "FrontImages,BackImages,Domination,CurrencyCode,SerialNumber"; 
     string[] fieldArrayList = fields.Split(','); 
     List<int> mappedList = new List<int>(); 

     for (int i = 0; i < fieldArrayRecord.Length; i++) 
     { 
      if (fieldArrayList.Any(s => string.Equals(fieldArrayRecord[i].Replace(" ", string.Empty), s, StringComparison.OrdinalIgnoreCase))) 
      { 
       mappedList.Add(i); 
      } 
     } 

     foreach (int index in mappedList) 
     { 
      Console.WriteLine(index); 
     } 
    } 
} 

Выход:

0 
1 
3 
4 

Или с использованием словаря:

class Program 
{ 
    static void Main(string[] args) 
    { 
     string firstLineOfRecord = "front images,Currency Code,Date,BackImages,Domination"; 

     string fields = "FrontImages,BackImages,Domination,CurrencyCode,SerialNumber"; 

     var dataFields = firstLineOfRecord.Split(',').Select((x, index) => new { FieldName = x.Replace(" ", string.Empty), Index = index }); 
     var tableFields = fields.Split(',').Select((x, index) => new { FieldName = x, Index = index }); 

     Dictionary<int, int> mapping = (from dataField in dataFields 
             let tableField = tableFields.SingleOrDefault(x => string.Equals(dataField.FieldName, x.FieldName, StringComparison.OrdinalIgnoreCase)) 
             where tableField != null 
             select new { DF = dataField.Index, TF = tableField.Index }) 
             .ToDictionary(c => c.DF, c => c.TF); 

     // Test: 

     string[] dataFieldsArray = firstLineOfRecord.Split(','); 
     string[] tableFieldsArray = fields.Split(','); 

     foreach (KeyValuePair<int,int> pair in mapping) 
     { 
      Console.WriteLine(
       "TableField '{0}' Index {1} has to be mapped to DataField '{2}' Index {3}", 
       tableFieldsArray[pair.Value], pair.Value, dataFieldsArray[pair.Key],pair.Key); 
     } 
    } 
} 

Выход:

TableField 'FrontImages' Index 0 has to be mapped to DataField 'front images' Index 0 
TableField 'CurrencyCode' Index 3 has to be mapped to DataField 'Currency Code' Index 1 
TableField 'BackImages' Index 1 has to be mapped to DataField 'BackImages' Index 3 
TableField 'Domination' Index 2 has to be mapped to DataField 'Domination' Index 4 
Смежные вопросы