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?

更新:

好的,我已经更新:

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

但是,IContent 有一个方法可以调用以提取更多信息,如下所示:

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

现在,虽然我希望过滤列表包含多个 IContent 项,但我想在决定是否应添加项之前检查字符串 GetMetaData。那有意义吗?

谢谢。

4

2 回答 2

1

你需要改变:

   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 和 Remove 等方法中测试相等性时使用。应该为可能存储在通用集合中的任何对象实现它。

正如注释所述,不要忘记:

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

是一个例子。

于 2010-09-27T11:43:48.687 回答
0

您不能将IContent对象添加到 a List<string>,因为 aList<String>只能保存字符串。

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

此外,C# 不是 Java;不要声明您的列表变量 a IList
如果你将它们声明为它们的实际类型(List<string>以及任何CreateDataSource返回值),你就不会遇到这个问题。

于 2010-09-27T11:42:05.947 回答