2011-12-28 5 views
6

Im próbuje zdobyć pierwszy występowaniu gazów w moim punkcie startowym podciąg może ktoś mi pomócJak zdobyć pierwszy występowaniu gazów char w podciąg

string dir = Request.MapPath(Request.ApplicationPath) + "\\App_GlobalResources\\"; 

foreach (var file in Directory.EnumerateFiles(dir, "*.resx")) 
{ 
    ddlResources.Items.Add(new ListItem { Text = file.Substring(firstoccuranceof("."), file.LastIndexOf(".")), Value = file }); 
} 

jeśli zrobić file.Substring (file.IndexOf (”. "), file.LastIndexOf (". ")) pojawia się błąd

+0

Czy możesz podać konkretny przykład, dla danego ciągu, co chcesz otrzymać? Przykład: jeśli ciąg znaków brzmi "" Hello_world.jpg ", jaki powinien być wynik? –

+0

Masz błąd składniowy, a mianowicie użycie "{''}" jak w: new ListItem {...}. Ponadto, dlaczego przypisujesz Text = i Value = ... nic nie robią i na koniec prawdopodobnie chcesz uzyskać nazwę pliku bez rozszerzenia .resx i otrzymujesz to za pomocą: file.Substring (0, fileLastIndexOf (".")) –

Odpowiedz

10

Aby odpowiedzieć na aktualne pytanie, możesz użyć string.IndexOf, aby uzyskać pierwsze wystąpienie postaci. Zauważ, że musisz odjąć tę wartość od połączenia LastIndexOf, ponieważ drugi parametr Substring to liczba znaków do pobrania, a nie indeks początkowy i końcowy.

Jednak ... Zamiast analizować nazwy, można po prostu użyć Path.GetFilenameWithoutExtension, aby bezpośrednio pobrać nazwę pliku.

+0

czy mógłbyś pokazać, co masz na myśli, ponieważ próbowałem tego w ten sposób file.Substring (file.IndexOf ("."), File.LastIndexOf (".")) – ONYX

+0

@KDM Co próbujesz osiągnąć? Prawdopodobnie potrzebujesz 'file.Substring (file.IndexOf (". "), File.LastIndexOf (". ") - file.IndexOf (". "))' - ale GetFilenameWithoutExtension może być tu lepiej ... –

+0

+1 za nie tylko powiedzenie, jak "powinni to zrobić zamiast tego", ale za udzielenie odpowiedzi na zadane pytanie _i dostarczenie alternatywnej metody – elmer007

5

pierwszego wystąpienia

String.IndexOf('.') 

Ostatnie wystąpienie

String.LastIndexOf('.') 
+0

Próbowałem file.IndexOf ("."), Ale pojawia się błąd – ONYX

+0

Jaki błąd? Czy możemy wiedzieć, aby zobaczyć, co ci się nie udaje? – King

6

Użyj metod łańcuchowych, aby uzyskać indeks pierwszego i ostatniego wystąpienia ciągu "wyszukiwania". Można użyć metod analizy ścieżki do użycia: System.IO.Path.GetExtension(), System.IO.Path.GetFileNameWithoutExtension() i System.IO.Path.GetDirectoryName().

Na przykład

string file = @"c:\csnet\info.sample.txt"; 
Console.WriteLine(System.IO.Path.GetDirectoryName(file));   //c:\csnet 
Console.WriteLine(System.IO.Path.GetFileName(file));    //info.sample.txt 
Console.WriteLine(System.IO.Path.GetFileNameWithoutExtension(file));//info.sample 
Console.WriteLine(System.IO.Path.GetExtension(file));    //.txt 
+1

Myślę, że to jest to, czego potrzebuje, aby uzyskać nazwę pliku bez ścieżki i rozszerzenia. –

+1

Tak. Robi to po drodze. Mógł nawet użyć podziału i dostał łańcuchy zamiast podciągu do tego zadania. Ta odpowiedź jest najlepsza dla jego zadania – King

0

Myślę, że w danym przypadku nie jesteś próbuje IndexOf ... Zamiast tego trzeba użyć 0, ponieważ staramy się utworzyć klucz na podstawie nazwy pliku, jeśli zrozumieć poprawnie:

`ddlResources.Items.Add(new ListItem(file.Substring(0, file.LastIndexOf(".")), file));` 

również masz „{}” się tam jak w nowym ListItem {...}, który również będzie powodować błąd składni ... tak czy inaczej spojrzeć ..

1

file.IndexOf (".")

Powinien być pierwszym wystąpieniem ".". W przeciwnym razie zwróci -1, jeśli nie zostanie znaleziony.

0

Ponieważ oryginalne pytanie jest oznaczone znacznikiem [regex], dostarczę następujące rozwiązanie, jednak najlepszą odpowiedzią na proste przetwarzanie ścieżek przy użyciu .NET nie jest wyrażenie regularne.

//extracts "filename" from "filename.resx" 
string name = Regex.Match("filename.resx", @"^(.*)\..+?$").Groups[1].Value; 

Użyj odpowiedź, która opiera się na klasie Path zamiast, dla uproszczenia. Inne odpowiedzi zawierają te informacje.