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");
}

ここで、filteredList に複数の IContent アイテムを含めたいのですが、アイテムを追加する必要があるかどうかを決定する前に、文字列 GetMetaData をチェックしたいと考えています。それは理にかなっていますか?

ありがとう。

4

2 に答える 2

1

変更する必要があります:

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

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

アップデート

これは比較を行うときに探すインターフェイスであるため、IContent実装する必要があるようです。次に、 内で文字列値を比較します。IEquatable<T>List<T>.ContainsEquals

IEquatable インターフェイスは、Contains、IndexOf、LastIndexOf、Remove などのメソッドで等しいかどうかをテストするときに、Dictionary、List、LinkedList などの汎用コレクション オブジェクトによって使用されます。ジェネリック コレクションに格納される可能性のあるすべてのオブジェクトに対して実装する必要があります。

メモに記載されているように、次のことを忘れないでください。

IEquatable を実装する場合は、Object.Equals(Object) および GetHashCode の基本クラスの実装もオーバーライドして、それらの動作が IEquatable.Equals メソッドの動作と一致するようにする必要があります。Object.Equals(Object) をオーバーライドする場合、オーバーライドされた実装は、クラスの静的 Equals(System.Object, System.Object) メソッドの呼び出しでも呼び出されます。これにより、Equals メソッドのすべての呼び出しが一貫した結果を返すことが保証されます。

ここに例があります。

于 2010-09-27T11:43:48.687 に答える
0

は文字列しか保持できないため、IContentオブジェクトを に追加することはできません。List<string>List<String>

a に変更すると、List<IContent>正常に動作します。

また、C# は Java ではありません。リスト変数を a と宣言しないでくださいIList
それらを実際の型 (List<string>およびCreateDataSource返されるもの) として宣言していれば、この問題は発生しませんでした。

于 2010-09-27T11:42:05.947 に答える