我正在使用名为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。这有意义吗?
感谢。
答案 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
返回),则不会出现此问题。