2013-06-04 13 views
10

Piszę krótkie C# do parsowania danego pliku XML. Ale 1 z wartości znaczników może się zmienić, ale zawsze zawiera słowa "Szybkie uruchamianie" (pomijając wielkość liter i spacje, ale musi być w tej samej kolejności) w klauzuli where. Nie jestem pewien, jak to zrobić w instrukcji sql like w C#.Oświadczenie Regex in Linq?

var selected = from cli in doc.Descendants(xmlns+ "Result") 
    where cli.Element(xmlns + "ResultsLocation").Value == "Assessments-Fast-Startup" 
         select cli; 
+0

gdzie jest sql? - wszystko, co widzę, to linq to xml –

+0

To właśnie miałem na myśli: – jerryh91

+0

szukasz dokładnego ciągu znaków, lub coś w stylu: szybki * startowy –

Odpowiedz

13

Zakładając szukasz dokładnej ciąg - można po prostu użyć String.Contains?

var selected = from cli in doc.Descendants(xmlns+ "Result") 
    where cli.Element(xmlns + "ResultsLocation").Value.Contains("Assessments-Fast-Startup") 
    select cli; 

W przeciwnym razie, coś jak:

var rx = new Regex("fast(.*?)startup", RegexOptions.IgnoreCase); 

var selected = from cli in doc.Descendants(xmlns+ "Result") 
    where rx.IsMatch(cli.Element(xmlns + "ResultsLocation").Value) 
    select cli; 
+0

jest (. *?) ignorowany przypadek? – jerryh91

+1

Nie, to tylko "szybkie uruchamianie". Możesz pominąć case w definicji regex –

2

regex z fast[- ]?start[- ]?up powinien działać

gdzie opcjonalny kreska lub przestrzeń może być oddzielenie części haseł

... 
where Regex.IsMatch(
    cli.Element(xmlns + "ResultsLocation").Value, 
    "fast[- ]?start[- ]?up", 
    RegexOptions.IgnoreCase 
) 
select cli 

jeśli okaże trzeba dostosować regex spróbować testera regex jak http://regexpal.com/

Jak @DaveBish wspomniał może być w porządku z .Contains(...) testu zamiast regex lub nawet .ToLower().Contains(...) łańcuchowych (może trzeba także czek null także)