2009-05-09 6 views
59

Jako programista inny niż .NET szukam równoważnika .net starej funkcji vb left(string, length). Był leniwy, ponieważ działał na dowolny ciąg znaków. Zgodnie z oczekiwaniami, left("foobar", 3) = "foo", podczas gdy, najkorzystniej, left("f", 3) = "f".. Odpowiednik .Net starej funkcji lewej vb (ciąg, długość)?

W .net string.Substring(index, length) zgłasza wyjątki dla wszystkiego poza zakresem. W Javie zawsze miałem pod ręką Apache-Commons lang.StringUtils. W Google nie bardzo daleko szukam funkcji ciągów.

Edit:

@Noldorin - Wow, dziękuję za rozszerzeń vb.net! Moje pierwsze spotkanie, chociaż zajęło mi kilka sekund, aby zrobić to samo w C#:

public static class Utils 
{ 
    public static string Left(this string str, int length) 
    { 
     return str.Substring(0, Math.Min(length, str.Length)); 
    } 
} 

Uwaga statyczne klasy i metody, a także kluczowe this. Tak, są tak proste, aby wywołać je jako "foobar".Left(3). Zobacz także c# extensions on msdn.

+0

Cieszę się, że Cię do nich zapoznałem. :) Są bardzo przydatnymi funkcjami zarówno VB.NET, jak i C# (o ile wiesz, jak z nich korzystać), a znajdziesz je przydatne przez cały czas. Przy okazji, nie jestem pewien, czy zdajesz sobie sprawę, ale funkcja Math.Min jest częścią BCL, więc równie dobrze możesz użyć go również w języku C#. – Noldorin

+0

@Nolderin - Bardzo zadbane, zredagowane w celu odzwierciedlenia komentarza Math.Min. Dziękuję Ci! – Josh

+1

Jako przypis, zwróć nowy ciąg znaków (str.Take (długość) .ToArray()); działa również. Wyobrażam sobie, że używanie podciągu jest prawdopodobnie szybsze. – Sean

Odpowiedz

48

Oto metoda rozszerzenie, które wykona pracę.

<System.Runtime.CompilerServices.Extension()> _ 
Public Function Left(ByVal str As String, ByVal length As Integer) As String 
    Return str.Substring(0, Math.Min(str.Length, length)) 
End Function 

Oznacza to, że można używać go jak starego VB Left funkcji (tj Left("foobar", 3)) lub przy użyciu nowszej składnię VB.NET, tj

Dim foo = "f".Left(3) ' foo = "f" 
Dim bar = "bar123".Left(3) ' bar = "bar" 
+0

Właśnie napisałem przykład metody rozszerzenia. – j0tt

+0

O ile mi wiadomo, metody rozszerzeń nie działają dla VB.NET – Oded

+1

@Oded: Z całą pewnością robią to w VB.NET 9. Musisz podać atrybut Extension, który jest zupełnie inny od metody dla C#. Zobacz http://msdn.microsoft.com/en-us/library/bb384936.aspx – Noldorin

1

Możesz zawinąć wywołanie do podłańcucha w nowej funkcji, która testuje jego długość zgodnie z sugestiami podanymi w innych odpowiedziach (we właściwy sposób) lub użyć przestrzeni nazw Microsoft.VisualBasic i użyć bezpośrednio po lewej stronie (ogólnie uważane za niewłaściwy sposób!)

+0

Nie powinieneś używać polecenia Spróbuj ... Złap, aby złapać coś, co możesz z łatwością sprawdzić wcześniej. – Guffa

+0

Tak, masz rację, a ja zredagowałem to dokładnie w tym samym czasie, co twój komentarz ... – RobS

+0

Dlaczego używasz przestrzeni nazw VisualBasic uważanej za "niewłaściwy sposób"? Właśnie dlatego jest uwzględnione. To część VB. –

5

można zrobić własny

private string left(string inString, int inInt) 
{ 
    if (inInt > inString.Length) 
     inInt = inString.Length; 
    return inString.Substring(0, inInt); 
} 

edit: kopalnia jest w C#, trzeba będzie zmienić go na Vb

29

Inną opcją jedna linia będzie coś jak następujący:

myString.Substring(0, Math.Min(length, myString.Length)) 

Gdzie myString jest ciągiem, z którym próbujesz pracować.

+0

To było pierwsze rozwiązanie, które przyszło mi do głowy. Myślałem, że musi być łatwiejszy/wbudowany sposób. Ale nie ma nikogo ... –

+0

Spodziewałem się tej odpowiedzi. Dzięki stary. – Hari

30

Dodaj odniesienie do biblioteki Microsoft.VisualBasic i można użyć tej samej metody, co, czyli dokładnie.

+1

Znacznie prostsze rozwiązanie - jaki jest sens wynalezienia nowego koła? – Billious

+0

Co jeśli chcę całkowicie pozbyć się referencji VB w mojej aplikacji .Net? – Hari

+4

To jest jak używanie widelca do mieszania zupy, gdy nie możesz znaleźć łyżki. –

11

nie zapomnij zerowej case

public static string Left(this string str, int count) 
    { 
     if (string.IsNullOrEmpty(str) || count < 1) 
      return string.Empty; 
     else 
      return str.Substring(0,Math.Min(count, str.Length)); 
    } 
+0

Myślę, że 'count <= 0' byłoby bardziej przejrzyste niż' count <1'. –

1

Inną techniką jest rozszerzenie obiektu String dodając metodę lewo().

Oto artykuł źródłowy w tej technice:

http://msdn.microsoft.com/en-us/library/bb384936.aspx

Oto moja realizacja (w VB):

Moduł StringExtensions

<Extension()> 
Public Function Left(ByVal aString As String, Length As Integer) 
    Return aString.Substring(0, Math.Min(aString.Length, Length)) 
End Function 

Moduł End

Następnie umieść to na górze Plik ny, w którym chcesz używać rozszerzenia:

Imports MyProjectName.StringExtensions 

Używaj go tak:

MyVar = MyString.Left(30) 
1

Lubię robić coś takiego:

string s = "hello how are you"; 
s = s.PadRight(30).Substring(0,30).Trim(); //"hello how are you" 
s = s.PadRight(3).Substring(0,3).Trim(); //"hel" 

chociaż, jeśli chcesz spływu lub początkowe spacje, wtedy masz pecha.

Bardzo podoba mi się użycie Math.Min, wydaje się lepszym rozwiązaniem.

5
using System; 

public static class DataTypeExtensions 
{ 
    #region Methods 

    public static string Left(this string str, int length) 
    { 
     str = (str ?? string.Empty); 
     return str.Substring(0, Math.Min(length, str.Length)); 
    } 

    public static string Right(this string str, int length) 
    { 
     str = (str ?? string.Empty); 
     return (str.Length >= length) 
      ? str.Substring(str.Length - length, length) 
      : str; 
    } 

    #endregion 
} 

Nie powinien zawierać błędu, zwraca puste wartości jako pusty łańcuch, zwraca skrócone lub podstawowe wartości. Użyj go jak "testx" .Left (4) lub str.Right (12);

0

Just In Case Very Special:

Jeśli robisz to w lewo, tak wtedy sprawdzić dane z jakiegoś częściowego łańcucha, na przykład: if(Strings.Left(str, 1)=="*") ...;

Następnie można również użyć C metod # instancji takich jako StartsWith i EndsWith, aby wykonać te zadania. if(str.StartsWith("*"))...;