Мне нужно сгруппировать данные, содержащиеся в списке, но я не могу жестко запрограммировать предложение groupBy, поскольку оно может быть определено пользователем.
Пример, показанный ниже, отлично работает с жестко запрограммированным «r.DeviceID» в операторе GroupBy. Что я хотел бы сделать, так это изменить это так, чтобы конечный пользователь мог выбрать поле, к которому будет применяться выражение. На данный момент пользователь может выбрать «DeviceId» из раскрывающегося списка. Можно ли изменить код, чтобы текст «DeviceId» из списка можно было использовать в примере, показанном ниже (например, для замены бита r.DeviceID). Это всего лишь сокращенный пример, но в «настоящей» версии много полей, по любому из которых пользователь может захотеть сгруппировать. Пожалуйста, не говорите "TEST01-". Также будет заменено регулярным выражением, определяемым пользователем.
List<ThirdPartyExportTransaction> transactions = new List<ThirdPartyExportTransaction>();
transactions.Add(new ThirdPartyExportTransaction { DeviceId = "TEST01-1", Unit = 1 });
transactions.Add(new ThirdPartyExportTransaction { DeviceId = "TEST01-2", Unit = 2 });
transactions.Add(new ThirdPartyExportTransaction { DeviceId = "TEST01-2", Unit = 3 });
transactions.Add(new ThirdPartyExportTransaction { DeviceId = "TEST01-1", Unit = 4 });
transactions.Add(new ThirdPartyExportTransaction { DeviceId = "TEST01-1", Unit = 5 });
transactions.Add(new ThirdPartyExportTransaction { DeviceId = "TEST01-2", Unit = 6 });
var s= transactions.GroupBy(r => extractText(r.DeviceId, "TEST01-.")); // Need to change this
// At this point s now holds the grouped list
private static string extractText(string fieldText, string regExp)
{
Match m = Regex.Match(fieldText, regExp);
return m.Success ? m.Value : "";
}
Отражение?
r => extractText(r.GetType().GetProperty("DeviceId").GetValue(r, null), "TEST01-.")
Вы можете составить лямбда-выражение программно:
http://blogs.msdn.com/b /haniatassi/archive/2008/10/28/генерация-лямбда-выражения-динамически.aspx