Хранение сложных данных в списке - PullRequest
0 голосов
/ 27 сентября 2010

Я работаю с продуктом под названием SiteFinity.

У меня есть класс, который выглядит так:

public class Categories
{    
    public IContent oContent {get; set;}    
}

Затем я перебираю список и пытаюсь проверить,текущее значение уже существует, например так:

IList items = base.CreateDataSource();
IList filteredList = new List<string>();

foreach (IContent cnt in items)
{
   if (!filteredList.Contains(cnt))
    {
        filteredList.Add(cnt);
    }
}
return filteredList;

Но это возвращает ошибку.Я правильно использую .Contains?

Обновление:

Хорошо Я обновил:

List<IContent> filteredList = new List<IContent>();

Однако в IContent есть метод, который можетбыть вызванным для извлечения дополнительной информации, которая выглядит примерно так:

foreach(IContent cnt in items)
{
    string strCat = cnt.GetMetaData("Category");
}

Теперь, хотя я хочу, чтобы FilterList содержал несколько элементов IContent, я хочу проверить строку GetMetaData, прежде чем решить, следует ли добавлять элемент.Это имеет смысл?

Спасибо.

Ответы [ 2 ]

1 голос
/ 27 сентября 2010

Вам нужно изменить:

   System.Collections.IList filteredList = new List<string>();

на

   List<IContent> filteredList = new List<IContent>();

Обновление

Звучит так, как будто вам нужно IContentреализовать IEquatable<T>, поскольку это интерфейс, который List<T>.Contains ищет при выполнении сравнения.Затем внутри Equals сравните строковые значения.

Интерфейс IEquatable используется универсальными объектами коллекции, такими как Dictionary, List и LinkedList, при проверке на равенство в таких методах, как Contains, IndexOf, LastIndexOfи удалить.Он должен быть реализован для любого объекта, который может храниться в общей коллекции.

И, как уже упоминалось в примечаниях, не забывайте:

Если вы реализуете IEquatable, вам следуеттакже переопределяют реализации базового класса Object.Equals (Object) и GetHashCode, чтобы их поведение соответствовало поведению метода IEquatable.Equals.Если вы переопределяете Object.Equals (Object), ваша переопределенная реализация также вызывается в вызовах статического метода Equals (System.Object, System.Object) вашего класса.Это гарантирует, что все вызовы метода Equals возвращают согласованные результаты.

Здесь является примером.

0 голосов
/ 27 сентября 2010

Вы не можете добавить свой IContent объект к List<string>, поскольку List<String> может содержать только строки.

Измените его на List<IContent>, и он будет работать нормально.

Кроме того, C # не является Java; не объявляйте список переменных a IList.
Если бы вы объявили их как настоящие типы (List<string> и все, что возвращает CreateDataSource), у вас не было бы этой проблемы.

...