Вопрос о работе с массивами в c#

#c# #asp.net #collections #arraylist

#c# #asp.net #Коллекции #список массивов

Вопрос:

Я создал статическую функцию, которая возвращает мне список массивов объектов:

  allThread =(ArrayList) AllQuestionsPresented.GetAllThreads();
  

Теперь у объектов есть свойства, которые я хочу вывести. Но я заметил, что я не могу ввести allThreads.Name … или
allThreads[«Name»] или allThreads[1], это не даст мне сам объект. Причина intellisense не распознает это..

Вот что я пытаюсь сделать..:

Эта функция находится в одном классе:

     public static ICollection GetAllThreads()
{
    ArrayList allThreads = new ArrayList();
    string findUserID = "SELECT UserID FROM Users";
    string myConnectionString = AllQuestionsPresented.connectionString;

    using (SqlConnection myConnection = new SqlConnection(myConnectionString))
    {
        SqlCommand sqlCommand = new SqlCommand(findUserID, myConnection);
        SqlDataReader reader = sqlCommand.ExecuteReader();
        while (reader.Read())
        {
            AllQuestionsPresented allQ = new AllQuestionsPresented((Guid)reader["UserID"]);
            allThreads.Add(allQ);
        }
    }
    return allThreads;
}
  

Это некоторый код из другой функции в другом классе:

     forumsPages = new Dictionary<int, List<DisplayAllQuestionsTable>>();
    allThread =(ArrayList) AllQuestionsPresented.GetAllThreads();//I want to convert the ICollection


    for (int i = 0; i < 20; i  )
    {
        threads.Add(new DisplayAllQuestionsTable(allThread[i].//And use it here. I want an object to be returned..same object that was stored in the ArrayList in the static function

    }
  

Ответ №1:

Я думаю, что вам нужно использовать универсальную версию, List<T> где T был бы тип AllQuestionsPresented . Это должно включить IntelliSense для вас, как вы ожидаете.

Можете ли вы опубликовать определение для AllQuestionsPresented ?

Комментарии:

1. Это класс со свойствами .. например, общедоступное строковое имя, общедоступная строковая фамилия, общедоступный возраст .. ничего важного

Ответ №2:

ИСПОЛЬЗУЙТЕ список:

  public static List<AllQuestionsPresented> GetAllThreads()
{
    List<AllQuestionsPresented> allThreads = new List<AllQuestionsPresented>();
    string findUserID = "SELECT UserID FROM Users";
    string myConnectionString = AllQuestionsPresented.connectionString;

using (SqlConnection myConnection = new SqlConnection(myConnectionString))
    {
        SqlCommand sqlCommand = new SqlCommand(findUserID, myConnection);
        SqlDataReader reader = sqlCommand.ExecuteReader();
        while (reader.Read())
        {
            AllQuestionsPresented allQ = new AllQuestionsPresented((Guid)reader["UserID"]);
            allThreads.Add(allQ);
        }
    }
    return allThreads;
}
  

Ответ №3:

ArrayList содержит только коллекции объектов; вам пришлось бы привести allThread[i] к представленному allquestions’у.

Вы могли бы рассмотреть возможность использования универсальных коллекций, но вам, вероятно, придется немного реорганизовать свою архитектуру, чтобы справиться с этим.

Комментарии:

1. оооо, я понимаю .. я бы лучше прибегнул к ArrrayList

Ответ №4:

1) Список массивов содержит объекты, поэтому к свойству объекта можно получить доступ без приведения объекта.

Наличие словаря, полного объектов, в некотором роде бессмысленно, я бы привел объекты к типу, который действительно полезен и обладает нужными вам свойствами. Для этого потребуется изменить способ работы вашего оператора select.

Честно говоря, нет необходимости в ArrayList, вы можете написать оператор select, чтобы заполнить коллекцию, которую вы хотите использовать instad.

Ответ №5:

Или используйте LINQ

 [Table(Name="Users")]
class User
{
   [Column]
   public Guid UserId;
}  

IEnumerable<User> questions;
using (SqlConnection myConnection = new SqlConnection(myConnectionString))
{
    var dc = new DataContext(myConnection);
   // Use ToArray to force all reads on the connection
    questions = 
        (from user in dc.GetTable<User>() 
        select new AllQuestionsPresented(user.UserId)).ToArray()
}

var threads = 
       from question in questions 
       select new DisplayAllQuestionsTable(question.SomeProperty);
  

Или если вы садист

 var threads = 
       from question in (
            from user in dc.GetTable<User>() 
            select new AllQuestionsPresented(user.UserId) )
       select new DisplayAllQuestionsTable(question.SomeProperty); 
  

Ответ №6:

Зачем использовать ArrayList? Вы могли бы просто использовать гораздо более подходящий

    List<objecttype here>
  

С помощью этой структуры данных вы можете получить доступ ко всему так, как вы хотите (с квадратными скобками). Даже функция ICollection совершенно бесполезна.