2012-05-07 2 views
0

У меня есть таблица базы данных, как это:Сортировать по расщепленной строка C# и LINQ

## Settings ## 
ID (string) 
Value (string) 

Идентификатор представляет собой строку, как этот Area.Category.SettingName. Я пытаюсь создать структуру меню на основе идентификаторов, поэтому я хотел бы, чтобы это было представлено так.

- Area 
-- Category 
--- SettingName 

Данные могут быть такими:

AreaOne.CategoryOne.MySetting 
AreaOne.CategoryOne.MySecondSetting 
AreaTwo.CategoryOne.MySetting 
... 

Так, чтобы сделать это, я пытался получить все один настройки уровня, и я попробовал, что с помощью этого кода:

List<Settings> settings = settings.GroupBy(x => x.ID.Split('.')[0]).FirstOrDefault().ToList() 

И ожидаемый этот результат:

AreaOne 
AreaTwo 

Но получил этот результат:

AreaOne 
AreaOne 
AreaTwo 

Что я делаю неправильно?

ответ

1

Если все вы хотите однозначном уровне настройки, правильный запрос будет

var delimiter = new[] {'.'}; 
settings.Select(x => x.ID.Split(delimiter, 2)[0]).Distinct().ToList() 

Это отсекает настройки L1 из каждой строки и использует Distinct, чтобы убедиться, что вы получите только каждый из них обратно один раз. Нет необходимости использовать GroupBy, если вы не хотите получать агрегированную информацию о каждой настройке L1 (например, если вы хотите получить полную информацию из базы данных, но сгруппированы по имени L1, потому что это удобно по какой-то причине).

Я также использовал перегрузку Split, которая принимает параметр «limit», потому что нет смысла выполнять работу, которую вы собираетесь выбросить.

И, наконец, использование комбинации FirstIndexOf и Substring было бы еще лучше.

+0

Спасибо Джон, работает как надо, нет необходимости в полном классе обратно, только строка, поэтому она идеальна. – Martin

+0

Я попытался добавить «лимит», но получил эту ошибку: «Не могу преобразовать из« int »в« char » – Martin

+0

@Martin: Виновато не уделять достаточного внимания. Если вам нужен предел, 'Split' заставляет вас давать разделители в виде массива. Отредактировал ответ, чтобы исправить его. – Jon

0

Добавить «.distinct()», или перекодирование сделать

var result = settings.Select(s => x.ID.Split('.')[0]).Distinct(); 
0

Вы должны устранить дублирование записей из списка результатов. Есть три входа, так что вы собираетесь получить три выхода:

Что-то вроде следующего должен возвращать только один из каждого:

settings.Select(x => x.ID.Split('.')[0]).Distinct().ToList() 
Смежные вопросы