2016-07-11 7 views
0

ich ein Datumsbereich wie dieses, Enthält doen 'T Prüfung im Datumsbereich

Ich möchte überprüfen NewsReleaseDate innerhalb der ActualReleaseDates ist

Aber im folgenden Code es Rückkehr kommen haben

string ActualReleaseDates ="7/8/2016, 7/9/2016, 7/11/2016,7/3/2016,7/10/2016,7/17/2016,7/24/2016,7/31/2016"; 
string NewsReleasedDate ="07/11/2016"; 
als falsch.

if (ActualReleaseDates.Split(',').Contains(NewsReleasedDate.TrimStart(new Char[] { '0' }))) 
{ 
    //some code here 
} 
+5

Nach Ihren eigenen Daten ist es auch nicht enthalten. Wenn man sich die Saiten anschaut '07/11/2016' ist nicht dasselbe wie' 7/11/2016' –

+3

@ AllanS.Hansen: Das ist vermutlich der Grund, warum es den "TrimStart" -Ruf gibt, obwohl das eine sehr schlechte Art zu sein scheint zu mir, da es "07/08/2016" nicht behandeln wird. –

+0

@ JonSkeet dann, was ist der bessere Weg? – TechGuy

Antwort

3

Das Leerzeichen Problem. Sie können trim() und ‚2016.07.11‘ verwenden ‚2016.07.11‘

var ActualReleaseDates = "7/8/2016, 7/9/2016, 7/11/2016,7/3/2016,7/10/2016,7/17/2016,7/24/2016,7/31/2016"; 
    var NewsReleasedDate = "07/11/2016"; 

    var splitActualReleaseDates = ActualReleaseDates.Split(',').Select(x => x.Trim()); 

    if (splitActualReleaseDates.Contains(NewsReleasedDate.TrimStart(new Char[] { '0' }))) 
    { 

    } 
6

Das sofort Problem ist, dass Ihre ActualReleaseDates Zeichenfolge nach Spaltung, keine Eingabe von "7/11/2016" ist. .. stattdessen gibt es einen Eintrag von " 7/11/2016" ... Notiz das Leerzeichen.

Aber grundsätzlicher, Trimmen nur den Beginn der NewsReleasedDate wird nicht helfen, wenn der Wert so etwas wie „2016.07.08“ ist ... was Sie sollte tun wird, diese Werte als Datumsangaben Handhabung, anstatt als Strings:

  • Split ActualReleaseDates durch Komma, analysiert dann jeden Wert (nach Leerzeichen Trimmen) in einem geeigneten Format (was ich vermute ist M/d/yyyy), so dass Sie ein List<DateTime> bekommen.
  • Parse NewsReleasedDate im entsprechenden Format, das ich vermute, ist MM/dd/yyyy, so erhalten Sie eine DateTime.
  • Prüfen Sie, ob der analysierte Wert aus dem zweiten Schritt in der Liste vom ersten Schritt an auftritt.

(ich persönlich würde empfehlen die Verwendung von Noda Time und Parsen zu LocalDate Werte, aber ich bin voreingenommen ...)

Grundsätzlich Sie versuchen, um zu sehen, ob ein Datum in einer Liste erfolgt von Daten ... so stellen Sie sicher, dass Sie Ihre Daten so früh wie möglich in ihre am besten geeignete Darstellung erhalten. Im Idealfall vermeiden Sie die Verwendung von Zeichenfolgen für diese überhaupt ... wir wissen nicht, woher Ihre Daten stammen, aber wenn es in einer anderen Darstellung gestartet und in Text konvertiert wurde, sehen Sie, ob Sie diese Konvertierung vermeiden können.

+0

@TechGuy: Nein, ich fürchte, ich habe * mehr * als genug auf meinem Teller und konzentriere mich darauf, was ich am besten kann (Sprachfunktionen). Diese Konversation ist jetzt * weg * vom Thema. Ich schlage vor, wir beide löschen unsere Kommentare hier ... –

1

können Sie Linq verwenden, um Ihre Strings in Datetime-Objekte zu konvertieren und vergleichen sie anstelle von Strings

string ActualReleaseDates ="7/8/2016,7/9/2016,7/11/2016,7/3/2016,7/10/2016,7/17/2016,7/24/2016,7/31/2016"; 
string NewsReleasedDate ="07/11/2016"; 

var releaseDates = ActualReleaseDates.Split(',').Select(x => DateTime.Parse(x)); 
var newsReleased = DateTime.Parse(NewsReleaseDate); 

if (releaseDates.Contains(newsReleased)) 
{ 
    //some code here 
} 

Bitte beachten Sie, dass Datetime jeweils mit der aktuellen Kultur analysiert wird. Sie können DateTime.ParseExact verwenden, wenn Sie das genaue Datumsformat angeben möchten.

1

Sie können Datetime prase, bevor Sie die Abfrage wie folgt vorgehen:

(Ich denke, das die genaueste und garantierte Art und Weise ist Daten zu vergleichen) wegen der

Func<string, DateTime> stringToDate = s => DateTime.ParseExact(s.Trim(), "M/d/yyyy", 
                 CultureInfo.InvariantCulture); 

DateTime newReleaseDateTime = stringToDate(NewsReleasedDate); 

bool result = ActualReleaseDates.Split(',').Select(x => stringToDate(x)) 
              .Contains(newReleaseDateTime); 
0

Es gibt false zurück date 07/11/2016 in NewsReleasedDate gespeichert wird als Zeichenfolge mit einer '0' am Anfang gespeichert. Und in der ActualReleaseDates-Zeichenfolge haben Sie Leerzeichen zwischen dem ',' und Zahlen.

Try theese Strings wie folgt zu umschreiben:

ActualReleaseDates ="7/8/2016,7/9/2016,7/11/2016,7/3/2016,7/10/2016,7/17/2016,7/24/2016,7/31/2016"; // white spaces removed. 

und die Variable wie folgt aus:

NewsReleasedDate ="7/11/2016"; // 0 removed 

Dies ist mein Codebeispiel:

string ActualReleaseDates = "7/8/2016,7/9/2016,7/11/2016,7/3/2016,7/10/2016,7/17/2016,7/24/2016,7/31/2016"; 
string NewsReleasedDate = "7/11/2016"; 
string[] dates = ActualReleaseDates.Split(','); 
Console.WriteLine(dates.Contains(NewsReleasedDate)); 

Dies ist nicht die beste Um Daten zu vergleichen, können Sie die Date-Klasse verwenden, die für solche Vergleiche nützlich ist.

Verwandte Themen