मुझे एक अजीब आवश्यकता है जैसे मुझे नीचे एक इनपुट स्ट्रिंग मान प्राप्त हो रहा है:

Id: 1 Caption: some caption Title: some title Grade: some grade Level: some level

स्ट्रिंग सामग्री विरासत डीबी से है और इसे बदलना मुश्किल है क्योंकि यह बहुत से क्षेत्र को प्रभावित करता है। मुझे इन मूल्यों को अपनी कक्षा में धकेलने की जरूरत है

public class MyClass
{
  public int Id { get; set; }
  public int Caption { get; set; }
  public int Title { get; set; }
  public int Grade { get; set; }
  public int Level { get; set; }
}

क्या कोई .NET उपकरण है जो बुद्धिमानी से ऐसी स्ट्रिंग या किसी तर्क को संसाधित करता है जो उपरोक्त वर्ग में फिट होने वाली किसी ऑब्जेक्ट पर स्ट्रिंग को संसाधित करने के लिए काम करता है?

0
Viswa 26 अक्टूबर 2020, 05:39

2 जवाब

सबसे बढ़िया उत्तर

मैं रेगेक्स को जाने का सुझाव दूंगा।

ये कोशिश करें:

var source = "Id: 1 Caption: some caption Title: some title Grade: some grade Level: some level";
var regex = new Regex(@"^Id:\ (?'Id'(\d+))\ Caption:(|\ (?'Caption'(.*))) Title:(|\ (?'Title'(.*)))\ Grade:(|\ (?'Grade'(.*)))\ Level:(|\ (?'Level'(.*)))$");
var match = regex.Match(source);

var output = new
{
    Id = match.Groups["Id"].Success ? int.Parse(match.Groups["Id"].Value) : -1,
    Caption = match.Groups["Caption"].Success ? match.Groups["Caption"].Value : "",
    Title = match.Groups["Title"].Success ? match.Groups["Title"].Value : "",
    Grade = match.Groups["Grade"].Success ? match.Groups["Grade"].Value : "",
    Level = match.Groups["Level"].Success ? match.Groups["Level"].Value : "",
};

यह मुझे देता है:

output

आपने इनपुट की संरचना पर बहुत अच्छा विवरण नहीं दिया है, लेकिन यह आपके द्वारा प्रदान किए गए एक उदाहरण के साथ काम करता है।

1
Enigmativity 26 अक्टूबर 2020, 08:06

एक अलग दृष्टिकोण का उपयोग करना, लेकिन एक जो निश्चित रूप से बुलेट प्रूफ नहीं है, लेकिन आपके लिए काम कर सकता है। वहाँ एक पैटर्न है, यदि फ़ील्ड पहचानकर्ता रिक्त स्थान के बिना "एकल" शब्द हैं। ":" पर बंटने से आपको कुछ ऐसा मिलेगा...

    [0] "Id”
    [1] " 1 Caption"
    [2] " some caption Title"
    [3] " some title Grade”
    [4] " some grade Level"
    [5] " some level"

आइटम [0] के बाद विभाजन में प्रत्येक आइटम के अंत में एक अतिरिक्त शब्द होगा। अंतिम वस्तु [५] में स्पष्ट रूप से यह अतिरिक्त शब्द नहीं होगा। विधि RemoveLastWord उस अंतिम शब्द को हटाने के लिए बस यही करती है।

private MyClass ParseData(string dataString) {
  string[] splitArray = dataString.Split(':');
  if (splitArray.Length >= 6) {
    string id = RemoveLastWord(splitArray[1].Trim());
    string cap = RemoveLastWord(splitArray[2].Trim());
    string title = RemoveLastWord(splitArray[3].Trim());
    string grade = RemoveLastWord(splitArray[4].Trim());
    string level = splitArray[5].Trim();
    if (int.TryParse(id, out int idValue)) {
      return new MyClass { Id = idValue, Caption = cap, Title = title, Grade = grade, Level = level };
    }
    else {
      // id is not a valid int setting to -1
      return new MyClass { Id = -1, Caption = cap, Title = title, Grade = grade, Level = level };
    }
  }
  return null;
}

private string RemoveLastWord(string data) {
  int lastIndex = data.LastIndexOf(" ");
  if (lastIndex > 0) {
    return data.Substring(0, lastIndex);
  }
  return data;
}

ऊपर इस्तेमाल किया गया वर्ग

public class MyClass {
  public int Id { get; set; }
  public string Caption { get; set; }
  public string Title { get; set; }
  public string Grade { get; set; }
  public string Level { get; set; }
}
1
JohnG 26 अक्टूबर 2020, 07:14