Ответ 1
Это не многомерный массив. Это массив объектов, которые были созданы с помощью инициализаторов объектов с анонимными типами.
Что означает такое выражение?
obj.DataSource = new[]
{
new {Text = "Silverlight", Count = 10, Link="/Tags/Silverlight" },
new {Text = "IIS 7", Count = 11, Link="http://iis.net" },
new {Text = "IE 8", Count = 12, Link="/Tags/IE8" },
new {Text = "C#", Count = 13, Link="/Tags/C#" },
new {Text = "Azure", Count = 13, Link="?Tag=Azure" }
};
Особенно эти строки: new {Text = "IIS 7"...}
Как создать такой массив вручную, чтобы он соответствовал этому источнику данных.
Это не многомерный массив. Это массив объектов, которые были созданы с помощью инициализаторов объектов с анонимными типами.
Сначала переформатируем этот код немного
obj.DataSource = new[]
{
new { Text = "Silverlight", Count = 10, Link = "/Tags/Silverlight" },
new { Text = "IIS 7", Count = 11, Link = "http://iis.net" },
new { Text = "IE 8", Count = 12, Link = "/Tags/IE8" },
new { Text = "C#", Count = 13, Link = "/Tags/C#" },
new { Text = "Azure", Count = 13, Link = "?Tag=Azure" }
};
Это не похоже на многомерный массив, а скорее на массив из 5 объектов. Эти объекты внутри массива имеют анонимный тип, созданные и инициализированные с помощью new { ... }
.
Что касается вашего вопроса о том, как вы можете вручную создать такой массив в соответствии с источником данных: вы, похоже, делаете именно это с приведенным выше кодом.
Похоже на массив анонимных типов.
Он создает новый массив объектов, содержащий группу анонимных объектов.
new {Text = "Azure", Count = 13, Link="?Tag=Azure" }
не создает хеш, как подобный синтаксис, например, в php, но скорее настоящий реальный объект со свойствами Test, Count и Link.
Хороший праймер для анонимных объектов можно найти здесь
Вы должны иметь возможность использовать один и тот же синтаксис для создания новых структур, подобных этому, значения свойств не обязательно должны быть константами:
string text = "Azure";
int count = 13;
string link = "?Tag=Azure";
new {Text = text, Count = count, Link=link }
Просто добавьте: Анонимные типы преобразуются компилятором в реальный объект. Таким образом, код будет изменен на нечто эквивалентное этому (MUCH упрощен, только чтобы показать, что компилятор создаст фактический класс):
internal sealed class AnonymousClass1
{
internal string Text { get; set; }
internal int Count { get; set; }
internal string Link { get; set; }
}
И ваш код будет изменен на:
obj.DataSource = new AnonymousClass1[]
{
new AnonymousClass1 {Text = "Silverlight", Count = 10, Link="/Tags/Silverlight" },
new AnonymousClass1 {Text = "IIS 7", Count = 11, Link="http://iis.net" },
new AnonymousClass1 {Text = "IE 8", Count = 12, Link="/Tags/IE8" },
new AnonymousClass1 {Text = "C#", Count = 13, Link="/Tags/C#" },
new AnonymousClass1 {Text = "Azure", Count = 13, Link="?Tag=Azure" }
};
В одной из моих программ у меня есть такой код (упрощенный!):
var myObjects = new []{
new { Id = Guid.NewGuid(), Title = "Some Title", Description = string.Empty },
new { Id = Guid.NewGuid(), Title = "Another Title", Description = string.Empty },
new { Id = Guid.NewGuid(), Title = "Number 3", Description = "Better than No2, but not much" }
}
foreach(var myObject in myObjects) {
DoSomeThingWith(myObject.Title);
}
Это работает, потому что это просто еще один класс (я даже получаю IntelliSense) за кулисами. Очевидно, что я выиграл от создания класса для этого объекта. В моем примере все объекты должны выглядеть одинаково. (Очевидно, что делать это для любых публичных пользователей было бы плохой идеей, поскольку компилятор мог бы изменить имя анонимного класса, если вы добавите/удалите некоторые из них)
Чтобы вернуть такой массив из используемой мной функции:
public object GetAnonymousArray()
{
var tbl = new List<object>();
while (___)
{
//fill array in cycle
tbl.Add(new {Text = someString, Count = someInt, Link = link});
}
return tbl;
}