在列表中存储复杂数据

时间:2010-09-27 11:38:30

标签: c# asp.net ilist sitefinity

我正在使用名为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 个答案:

答案 0 :(得分:1)

您需要更改:

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

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

<强>更新

听起来你需要IContent实现IEquatable<T>,因为这是List<T>.Contains在进行比较时所寻找的界面。然后在Equals内,比较字符串值。

  

在Contains,IndexOf,LastIndexOf和Remove等方法中测试相等性时,IEquatable接口由泛型集合对象(如Dictionary,List和LinkedList)使用。它应该针对可能存储在泛型集合中的任何对象实现。

正如笔记所述,不要忘记:

  

如果实现IEquatable,还应该覆盖Object.Equals(Object)和GetHashCode的基类实现,以使它们的行为与IEquatable.Equals方法的行为一致。如果您重写了Object.Equals(Object),则在调用类上的静态Equals(System.Object,System.Object)方法时也会调用重写的实现。这可确保Equals方法的所有调用都返回一致的结果。

Here就是一个例子。

答案 1 :(得分:0)

您无法将IContent对象添加到List<string>,因为List<String>只能包含字符串。

将其更改为List<IContent>,它会正常工作。

另外,C#不是Java;不要将列表变量声明为IList 如果您将它们声明为实际类型(List<string>以及CreateDataSource返回),则不会出现此问题。