Person-Klasse beide Doppel-und String-Daten enthalten:Wie eine Klassenliste sortieren, die
class Person
{
public string ID;
public string Name;
public string PClass;
public string Age;
public string Sex;
public string Survived;
public string SexCode;
public Person(string id,string name,string pclass,string age,string sex,
string survived,string sexcode)
{
ID = id;
Name = name;
PClass = pclass;
Age = age;
Sex = sex;
Survived = survived;
SexCode = sexcode;
}
Mein Programmcode:
class Program
{
static void Main(string[] args)
{
string[] data = File.ReadAllLines("titanic.csv");
data = data.Skip(1).ToArray();
List<Person> personList = new List<Person>();
List<Person> personList_name = new List<Person>();
List<Person> personList_pclass = new List<Person>();
List<Person> personList_age = new List<Person>();
List<Person> personList_sex = new List<Person>();
List<Person> personList_id = new List<Person>();
for (int i = 0; i < data.Length; i++)
{
string[] temp = Regex.Split(data[i], ",(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)");
Person person = new Person(temp[0], temp[1], temp[2],temp[3],
temp[4], temp[5], temp[6]);
personList.Add(person);
}
personList_name = personList.OrderBy(x => x.Name).ToList();
personList_pclass = personList.OrderBy(z => z.PClass).ToList();
personList_sex = personList.OrderBy(w => w.Sex).ToList();
int id_;
int age_;
personList_age = personList.OrderBy(y => int.TryParse(y.Age, out age_)).ToList();
//personList_id = personList.OrderByDescending(int.TryParse(ID, out number)).ToList();
personList_id = personList.OrderBy(o => int.TryParse(o.ID, out id_)).ToList();
while (true)
{
Console.WriteLine(" Please select your filtring method:\n" +
"1-By Name\n2-By Pclass\n3-By Age\n4-By Sex\n5-By ID\n Press -1 to quit.");
string selection = Console.ReadLine();
if (selection == "-1")
{
break;
}
Console.WriteLine(("{0,-10}{1,70}{2,20}{3,20}{4,20}{5,20}{6,20}"), item.ID.Trim('"'), item.Name.Trim('"'), item.PClass.Trim('"')
, item.Age, item.Sex.Trim('"'), item.Survived.Trim('"')
, item.SexCode.Trim('"'));
}
}
if (selection == "3")
{
Console.WriteLine(("{0,-10}{1,70}{2,20}{3,20}{4,20}{5,20}{6,20}"), "ID", "NAME", "PCLASS", "AGE", "SEX", "SURVIVED", "SEXCODE");
foreach (var item in personList_age)
{
Console.WriteLine(("{0,-10}{1,70}{2,20}{3,20}{4,20}{5,20}{6,20}"), item.ID.Trim('"'), item.Name.Trim('"'), item.PClass.Trim('"')
, item.Age, item.Sex.Trim('"'), item.Survived.Trim('"')
, item.SexCode.Trim('"'));
}
}
}
}
}
ich in der Lage bin String-Daten aus einer CSV-Datei zu sortieren, wie Name, aber für Alter und ID kann ich nicht die richtige Reihenfolge (aufsteigend oder absteigend) erhalten Ich habe viel über dieses Problem gesucht. Versucht, Icomparable und Tryparse zu verwenden, aber ohne ein positives Ergebnis. Das Problem ist, dass Orderby mit Alter und ID als String arbeitet. Aber wenn ich Age und ID als Double oder Int definiere, werde ich beim Definieren des Temp-Arrays "nicht konvertieren" können. Jeder hilfreiche Vorschlag oder Lösung BITTE?
Das passiert, wenn ich zB nach Age ordere. Es scheint immer noch nach ID zu bestellen!
Die Codewand ist zu schwer zu lesen (besonders bei übermäßigem vertikalem Abstand). Reduziere auf ein * minimales * Beispiel, das dein Problem zeigt. – Richard
Erstellen Sie keine neuen Listen und weisen Sie sie dann über sie zu. 'var personList_name = new Liste(); personList_name = personList.OrderBy (...); 'Ordnen Sie unnötigerweise eine neue Liste zu und überschreiben Sie sie dort mit der zweiten Zeile. Auch Ihre 'OrderBy's mit dem' Tryparse' in ihnen ordnen sich nach dem Ergebnis der Methode an, die 'true' /' false' ist und NICHT den geparsten Wert. Wenn sie erfolgreich parsen, werden sie nach 'true' geordnet; Dinge, die nicht analysiert werden, werden mit 'false' geordnet. In einer (aufsteigenden) Reihenfolge kommt 'falsch 'vor' wahr '. Danach sind die Ergebnisse wahrscheinlich (?) Zufällig. –
pinkfloydx33