Как изменить список LINQ в массив - PullRequest
1 голос
/ 29 апреля 2011

Мне нужно написать запрос в веб-приложении, используя LINQ, но мне нужно изменить этот запрос в список массивов.Как я могу изменить запрос ниже, чтобы сделать это?

var resultsQuery =
    from result in o["SearchResponse"]["Web"]["Results"].Children()
    select new
    {
        Url = result.Value<string>("Url").ToString(),
        Title = result.Value<string>("Title").ToString(),
        Content = result.Value<string>("Description").ToString()
    };

Ответы [ 3 ]

2 голосов
/ 29 апреля 2011

Если вам действительно нужно создать ArrayList, вы можете написать new ArrayList(resultsQuery.ToArray()).

Однако вместо этого вы должны использовать List<T>, написав resultsQuery.ToList().

Обратите внимание, что в обоих случаях список будет содержать объекты анонимного типа.

1 голос
/ 29 апреля 2011

Существует метод .ToArray (), который преобразует IEnumerable в массив.

0 голосов
/ 29 апреля 2011

ArrayList не имеет конструктора или метода Add (Range), который принимает IEnumerable. Так что остается два варианта:

  • Используйте промежуточную коллекцию, которая реализует ICollection: поскольку и Array, и List<T> орудие ICollection можно использовать с помощью методов расширения ToArray() или ToList() из LINQ.

  • Создайте экземпляр ArrayList, а затем добавьте каждый элемент результата:

    var query = /* LINQ Expression */
    var res = new ArrayList();
    foreach (var item in query) {
      res.Add(item);
    }
    

Первый метод прост в использовании, но он подразумевает создание промежуточной структуры данных (какой из двух вариантов имеет более высокие издержки - интересный вопрос и частично зависит от запроса, поэтому нет общего ответа). Последний - больше кода и включает в себя увеличение ArrayList постепенно (так что больше памяти для GC, как было бы для промежуточного Array или List<T>).

Если вам просто нужно это в одном месте, вы можете просто сделать код встроенным, если вам нужно сделать это в нескольких местах, создайте свой собственный метод расширения для IEnumerable<T>:

public static class MyExtensions {
  public static ArrayList ToArrayList<T>(this IEnumerable<T> input) {
    var col = input as ICollection;
    if (col != null) {
      return new ArrayList(col);
    }

    var res = new ArrayList();
    foreach (var item in input) {
      res.Add(item);
    }
    return res;
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...