2009-02-12 6 views
1

У меня есть коллекция. Колонка имеет строки:Извлечение части строки

Location="Theater=2, Name=regal, Area=Area1" 

и так далее. Мне нужно извлечь только бит Name из строки. Например, здесь я должен извлечь текст «царственный»

Я борюсь с запросом:.

Collection.Location ???? (что добавить)

Какой самый короткий и точный способ сделать это?

[Изменить]: Что делать, если я должен добавить к статье GroupBy

Collection.GroupBy (????);

ответ

1

Другой LINQ-стиль ответа (без накладных расходов словаря):

var name = (from part in location.Split(',') 
      let pair = part.Split('=') 
      where pair[0].Trim() == "Name" 
      select pair[1].Trim()).FirstOrDefault(); 

повторно группе (редактировать):

var records = new[] { 
     new {Foo = 123, Location="Theater=2, Name=regal, Area=Area1"}, 
     new {Foo = 123, Location="Name=cineplex, Area=Area1, Theater=1"}, 
     new {Foo = 123, Location="Theater=2, Area=Area2, Name=regal"}, 
    }; 
    var qry = from record in records 
       let name = (from part in record.Location.Split(',') 
          let pair = part.Split('=') 
          where pair[0].Trim() == "Name" 
          select pair[1].Trim()).FirstOrDefault() 
       group record by name; 
    foreach (var grp in qry) 
    { 
     Console.WriteLine("{0}: {1}", grp.Key, grp.Count()); 
    } 
+0

Как добавить это в предложение GroupBy Colle.GrouBy (???); – 2009-02-12 05:27:04

2
Location.Split(",").Select(x => x.Split("=")[1]) 

Это крайне ленивые, полностью-без обработки ошибок способа сделать это :)

+0

Это будет взорваться, если порядок значений изменится. –

+0

linq overkill, и этот код не работает для меня в LinqPad (массив за пределами границ). location.Split (',') [1] .Split ('=') [1] верен для толпы «короткого обфузированного хрупкого кода» –

+0

Linq является излишним? Это часть рамки! Если Linq переполнен, зачем использовать строки? Почему бы не использовать массивы символов? Черт, зачем вообще использовать .NET? Давайте укажем его в машинный код x86! –

2

Быстрого и грязным способом является простым извлечением IndexOf/Substring:

string location = "Theater=2, Name=regal, Area=Area1"; 

int startPos = location.IndexOf("Name=") + 5; 
int endPos = location.IndexOf(",", startPos); 

string name = location.Substring(startPos, endPos - startPos); 
3

Расширения на ответ Павла:

var location = "Theater=2, Name=regal, Area=Area1"; 

var foo = location 
    .Split(',') 
    .Select(x => x.Split('=')) 
    .ToDictionary(x => x[0].Trim(), x => x[1]); 

Console.WriteLine(foo["Name"]); 

Это заполняет исходную строку в словаре для удобства использования. Опять же, проверка ошибок или что-то еще.

2

Если Regex вариант вы можете использовать обратная конструкция позволяет выровнять точное совпадение. Образец, который я использовал ниже, должен отлично работать в C#. Самое приятное в этом состоит в том, что он будет продолжать работать, даже если к части имени добавляются дополнительные элементы с разделителями-запятыми.

System.Text.RegularExpressions.Match m = 
     System.Text.RegularExpressions.Regex.Match(
      "Theater=2, Name=regal, Area=Area", @"(?<=Name=)[a-zA-Z0-9_ ]+(?=,)"); 
    Console.WriteLine(m.Value);