2010-09-27 3 views
0

Я работаю с продуктом 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?

Update:

Ok Я обновил:

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

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

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

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

Спасибо.

ответ

0

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

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

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

1

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

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

в

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

Update

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

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

И, как отмечает говоря, не забывайте:

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

Here является примером.

+0

Привет, Это был тип фактически на полпути через отладку .... – higgsy

+0

Я изменил его: System.Collections.IList filteredList = новый список (); IContent имеет строковое свойство, как так: Еогеасп (IContent CNT в пунктах) { строка strCategory = cnt.getMetaData ("Категория"); } И на самом деле мне нужно проверить это строковое значение, чтобы определить, следует ли добавлять cnt в список .... deos, которые имеют смысл – higgsy

+0

Извините, это было совсем немного gobbeldy gook! Я изменил его на: System.Collections.IList filterList = новый Список (); IContent имеет свойство string так: foreach (IContent cnt в элементах) {string strCategory = cnt.getMetaData ("Категория"); } И мне действительно нужно проверить это строковое значение, чтобы определить, следует ли добавлять cnt в список .... deos, которые имеют смысл – higgsy

Смежные вопросы