スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

[C#] IEqualityComparerを使ってListのContains

List配列で、同じオブジェクトが入っている事を確認する場合、
Containsを使用し、簡単にbool値を取得することができますが、
今回、同じオブジェクトではないけど、比較オブジェクト内のある属性を比較したい場合、
簡単に比較する事ができたのでメモします。
(いまさらですが)

使う物は、
・System.ServiceModel.Syndication名前空間
・System.Xml名前空間
・IEqualityComparerインタフェース
です。

例として、地震情報のRSS(Goo地震RSS)を取得し、
RSSのSyndicationItemのTitleの比較しています。

1. 比較クラスの作成
   実行コードから、アクセス出来る場所に以下のクラスを作成します。

        public class CompareSyndicationItem : IEqualityComparer<SyndicationItem> {

            public bool Equals(SyndicationItem x, SyndicationItem y) {

                return x.Title.Text == y.Title.Text;

            }


            public int GetHashCode(SyndicationItem obj) {

                return obj.Title.Text.GetHashCode();

            }

        }
   ここでは、SyndicationItemは、RSSのentryのオブジェクトです。
   IEqualityComparerインタフェースを用います。
   必要なメンバは、EqualsとGetHashCodeです。
   Equalsには、比較文を書きます。(同じであればTrueを返します)
   GetHashCodeは、比較対象のハッシュを返します。(とりあえずGetHashCode()を)

2. 使い方

            SyndicationFeed feed;

            string uri = "http://weather.goo.ne.jp/earthquake/index.rdf";

            using (XmlReader rdr = XmlReader.Create(uri)) {

                feed = SyndicationFeed.Load(rdr);

            }


            // 適当なItemを作成する。適当なURIです。。。

            SyndicationItem compItem = new SyndicationItem("TestTitle", "", new Uri(uri));

            // titleが同じitemを取得する

            CompareSyndicationItem csi = new CompareSyndicationItem();

            if (feed.Items.Contains(compItem, csi))

                Console.WriteLine("一致するタイトルがありました");

            else

                Console.WriteLine("一致するタイトルがありませんでした。");
   ここでは、SyndicationFeedにRSSを読込み、
   比較するアイテム(entry)を適当に作って比較しています。

今まで、ループを回してたけど、調べてみるもんだなぁ。
おわり。

スポンサーサイト

テーマ : プログラミング
ジャンル : コンピュータ

コメントの投稿

非公開コメント

プロフィール

ss_9

名前 :ss_9
紹介 :
20代はエンジニア、30代はプロ、40代は管理、50代は人脈。

Twitterボタン

最新記事
カテゴリ
AD
月別アーカイブ
RSSリンクの表示
RSSリンクの表示
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。