3 using System.Collections.Generic;
\r
4 using System.Xml.Serialization;
\r
6 namespace NaGet.Packages
\r
9 /// パッケージのリストの情報を示すクラス
\r
11 [XmlRoot("PackageList", Namespace="http://diffshare.tv/xmlns/2007/na-get/PackageList/")]
\r
12 public class PackageList<TPackage> where TPackage : Package
\r
22 private List<TPackage> packageArrayList;
\r
27 public PackageList()
\r
29 packageArrayList = new List<TPackage>();
\r
33 /// 本リストが格納しているパッケージのリスト
\r
35 [XmlElement("Package", Namespace="http://diffshare.tv/xmlns/2007/na-get/PackageList/")]
\r
36 public TPackage[] Packages
\r
40 return packageArrayList.ToArray();
\r
48 #region パッケージの追加/削除とイテレーション
\r
53 /// <param name="pkgs"></param>
\r
54 public void SetPackages(IEnumerable<TPackage> pkgs)
\r
56 packageArrayList.Clear();
\r
58 packageArrayList.AddRange(pkgs);
\r
63 /// 本リストが格納しているパッケージのイテレータを返す
\r
65 /// <returns>パッケージのイテレータ</returns>
\r
66 public IEnumerator<TPackage> GetEnumerator()
\r
68 return packageArrayList.GetEnumerator();
\r
74 /// <param name="package">追加するパッケージ</param>
\r
75 public void AddPackages(IEnumerable<TPackage> package)
\r
77 packageArrayList.AddRange(package);
\r
81 /// パッケージをリストにマージ(追加)する
\r
83 /// <param name="package">追加するパッケージ</param>
\r
84 public void AddPackages(PackageList<TPackage> pkgList)
\r
86 packageArrayList.AddRange(pkgList.packageArrayList);
\r
92 /// <param name="package">追加するパッケージ</param>
\r
93 public void AddPackage(TPackage package)
\r
95 packageArrayList.Add(package);
\r
101 /// <param name="package">削除するパッケージ</param>
\r
102 public void RemovePackage(TPackage package)
\r
104 packageArrayList.Remove(package);
\r
111 #region 検索用Predicate
\r
114 /// パッケージを検索をする際のPredicateを返す
\r
116 /// <param name="key">検索キー</param>
\r
117 protected internal static Predicate<TPackage> GetPredicateForSearch(string key)
\r
119 string lowerKey = key.ToLower();
\r
120 return delegate(TPackage package) {
\r
121 return package.Name.ToLower().IndexOf(lowerKey) >= 0 ||
\r
122 package.Summary.ToLower().IndexOf(lowerKey) >= 0 ||
\r
123 ((package.Tags ?? string.Empty).ToLower().IndexOf(lowerKey) >= 0);
\r
128 /// パッケージ名で検索をする際のPredicateを返す
\r
130 /// <param name="name">
\r
136 protected internal static Predicate<TPackage> GetPredicateForPackageName(string name)
\r
138 return delegate(TPackage package) {
\r
139 return package.Name == name;
\r
144 /// エントリで検索をする際のPredicateを返す
\r
146 /// <param name="entry">
\r
152 protected internal static Predicate<TPackage> GetPredicateForEntry(Entry entry)
\r
154 return entry.Match;
\r
160 /// パッケージを検索して、それにマッチしたパッケージをイテレータとして返す。
\r
162 /// <param name="predicate">検索条件のPredicate</param>
\r
163 /// <returns>マッチしたパッケージのイテレータ</returns>
\r
164 protected internal IEnumerable<TPackage> Search(Predicate<TPackage> predicate)
\r
166 return packageArrayList.FindAll(predicate);
\r
170 /// パッケージを検索して、それにマッチしたパッケージをイテレータとして返す。
\r
172 /// <param name="key">検索キー</param>
\r
173 /// <returns>マッチしたパッケージのイテレータ</returns>
\r
174 public IEnumerable<TPackage> Search(string key)
\r
176 if (string.IsNullOrEmpty(key)) {
\r
177 return packageArrayList.AsReadOnly();
\r
179 return Search(GetPredicateForSearch(key));
\r
184 /// 指定した名前に対応するパッケージを返す
\r
186 /// <param name="name">検索にかけるパッケージ名</param>
\r
187 public TPackage GetPackageForName(string name)
\r
189 return packageArrayList.Find(GetPredicateForPackageName(name));
\r
193 /// 指定した名前に対応するパッケージを返す
\r
195 /// <param name="name">検索にかけるパッケージ名</param>
\r
196 public IEnumerable<TPackage> GetPackagesForName(string name)
\r
198 return packageArrayList.FindAll(GetPredicateForPackageName(name));
\r
202 /// 名前・バージョンが対応するパッケージを返す
\r
204 /// <param name="name">検索にかけるパッケージ名</param>
\r
205 /// <param name="version">検索にかけるパッケージのバージョン</param>
\r
206 public TPackage GetPackageForPackage(string name, string version)
\r
208 return GetPackageForEntry(new Entry(name, null, version));
\r
212 /// パッケージ参照エントリが対応するパッケージを返す
\r
214 /// <param name="name">検索にかけるパッケージ参照エントリ</param>
\r
215 public TPackage GetPackageForEntry(Entry entry)
\r
217 return packageArrayList.Find(GetPredicateForEntry(entry));
\r
221 /// パッケージ参照エントリが対応するパッケージをすべて返す
\r
223 /// <param name="name">検索にかけるパッケージ参照エントリ</param>
\r
224 public IEnumerable<TPackage> GetPackagesForEntry(Entry entry)
\r
226 return packageArrayList.FindAll(GetPredicateForEntry(entry));
\r
232 /// パッケージリストの各PackageListNameを設定する
\r
234 /// <param name="pkgList">設定するパッケージが入っているパッケージリスト</param>
\r
235 public void FixPackageListName()
\r
237 foreach (TPackage pkg in packageArrayList) {
\r
238 pkg.PackageListName = this.Name;
\r