Предполагая, что ваш формат данных соответствует описанию, это может быть то, что вы ищете? Вам все еще, вероятно, следует использовать String.Split () для работы с вводом, так как это список с разделителями строк, но вы можете, по крайней мере, сделать его анонимной типизированной коллекцией.
string input = "10:name1*20:name2*30:name3*40:name4*50:name5";
var data =
(
from pair in input.Split( '*' )
let student = pair.Split( ':' )
select new { Grade = int.Parse( student[ 0 ] ), Name = student[ 1 ] }
);
foreach( var student in data )
{
Console.WriteLine( student );
}
Edit:
Кажется, у вас отношения 1: много -> ученик? Возможно, вам стоит изучить коллекцию Lookup , чтобы легко получить всех учеников с оценкой N.
string input = "10:name1.1*name1.2*name1.3,20:name2.1*name2.2*,30:name3.1,40:name4.1*name4.2*name4.3,50:name5.1";
var studentData = ( Lookup<int,string[]> )
(
from
line in input.Split( ',' )
where
line.IndexOf( ':' ) > -1
let
grade = line.Substring( 0, line.IndexOf( ':' ) )
let
names = line.Remove( 0, grade.Length + 1 ).Split( '*' )
select
new { Grade = int.Parse( grade ), Students = names }
).ToLookup( s => s.Grade, s => s.Students );
foreach( IGrouping<int,string[]> gradeSet in studentData )
{
Console.WriteLine( gradeSet.Key );
Console.WriteLine( studentData[ gradeSet.Key ] );
}
Кроме того, я понимаю, что это не «linqy-est» решение, но, надеюсь, оно облегчит вашу работу.