Обратите внимание, что возможно некоторое "бормотание" по отношению к анонимным типам с помощью c # благодаря двум вещам:
- Тип вывода
- объединение идентичных анонимных типов
Если вы счастливы полагаться на то, что эти две вещи остаются неизменными (на это нет никаких гарантий, особенно в отношении 2), тогда может пригодиться следующее.
public static class Mumble
{
public static HashSet<T> HashSet<T>(T prototype)
{
return new HashSet<T>();
}
public static List<T> List<T>(T prototype)
{
return new List<T>();
}
}
Вы можете использовать его так:
var set = MumbleSet(new { Foo="", Bar="", Baz=0 });
var list = MumbleList(new { Foo="", Bar="", Baz=0 });
set.Add(new { Foo="x", Bar="y", Baz=1 });
set.Add(new { Foo="a", Bar="b", Baz=1 });
list.Add(new { Foo="a", Bar="b", Baz=1 });
var intersection = list.Intersect(set);
var concat = list.Concat(set);
Это хорошо работает в тех случаях, когда у вас есть анонимные типы, которые вы хотите заполнить в какой-либо другой коллекции для использования в другом месте метода. Распространенным применением было бы чтение из запроса к базе данных в набор для последующей проверки существования в цикле, где выражение этого в виде последовательности запросов linq было либо слишком громоздким, либо слишком дорогим.
Для вашего примера мотивации вы должны добавить следующее:
class TimeSerie<TValue>
{
// or some other constructor equivalent
public TimeSerie(TValue value) { /* assign the value */ }
}
static class TimeSerieMumble
{
public static TimeSerie<TValue> New<TValue>(TValue value)
{
return new TimeSerie<TValue>(value);
}
}
Тогда вы можете использовать код так:
var tsList = Mumble.List(TimeSerieMumble.New(new { Name="", Value=0 }));
foreach (var x in from c select new { c.Name, c.Value })
{
tsList.Add(TimeSerieMumble.New(new { x.Name, x.Value }));
}
Бормочить, что «просачивается» в публичный API, невозможно в c # 3.5, если только тип не должен быть бормотан через серию логических методов вывода типа таким же образом, как в вышеприведенном примере. Я никогда не видел случая, чтобы такая вещь была полезной, учитывая результирующие искажения, необходимые для вызывающего кода. Я не думаю, что это улучшит читабельность либо. Как правило, использование более чем двух уровней бормотания в примере «Имя / Значение» может привести к серьезным осложнениям в будущем.