Проблема с общим списком и методом расширения (C # 3.0) - PullRequest
0 голосов
/ 28 апреля 2010

У меня есть проблема. Я делаю класс расширения для коллекции, и он является общим .. как

public static class ListExtensions
    {

        public static ICollection<T> Search<T>(this ICollection<T> collection, string stringToSearch)
        {
            ICollection<T> t1=null;           

            foreach (T t in collection)
            {
                Type k = t.GetType();
                PropertyInfo pi = k.GetProperty("Name");
                if (pi.GetValue(t,null).Equals(stringToSearch))
                {
                    t1.Add(t);
                }
            }
            return t1;
        }
    }

Но я не могу добавить элементы в t1, так как он объявлен нулевым. Ошибка: ссылка на объект не установлена ​​для экземпляра объекта.

Я вызываю метод как

List<TestClass> listTC = new List<TestClass>();

            listTC.Add(new TestClass { Name = "Ishu", Age = 21 });
            listTC.Add(new TestClass { Name = "Vivek", Age = 40 });
            listTC.Add(new TestClass { Name = "some one else", Age = 12 });
            listTC.Search("Ishu");

И тестовый класс

public class TestClass
    {
        public string Name { get; set; }
        public int Age { get; set; }
    }

Использование: (C # 3.0) & Framework - 3.5 Спасибо

Ответы [ 2 ]

1 голос
/ 28 апреля 2010

Поскольку вы, вероятно, не хотите манипулировать (добавлять, удалять, ...) результатами поиска после выполнения Search, рекомендуется возвращать IEnumerable<T> вместо ICollection<T>. Также C # имеет специальный синтаксис для этого: yield

public static class ListExtensions
{
    public static IEnumerable<T> Search<T>(this ICollection<T> collection, string stringToSearch)
    {
        foreach (T t in collection)
        {
            Type k = t.GetType();
            PropertyInfo pi = k.GetProperty("Name");
            if (pi.GetValue(t,null).Equals(stringToSearch))
            {
                yield return t;
            }
        }
    }
}
1 голос
/ 28 апреля 2010

Ну, какую коллекцию вы хотите использовать? Вы должны иметь фактическую коллекцию, чтобы добавить свои результаты. List<T>, вероятно, самое простое предложение. Просто измените первую строку метода:

ICollection<T> t1 = new List<T>();

РЕДАКТИРОВАТЬ: Хотя это самое простое изменение в коде, вам определенно следует рассмотреть возможность использования блока итератора согласно ответу Томаса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...