私はオブジェクトのコレクションを持っていますIEnumerable<object> obs
。 私はオブジェクトの別のコレクションIEnumerable<object> data
を持っています。私はob
などの特定のプロパティに同じ値を有するdata
の最初の項目を見つける必要がobs
各ob
についてあちこちに区切りのある列挙型を構築する
。例えば、私はdata
の最初の項目がToString()
の値がob
と同じものを探している可能性があります。プロパティ値が一致する最初の項目が見つかると、見つかったデータ項目で何かを実行し、次にob
をobs
にチェックします。何も見つからなければ、私はエラーを投げます。
foreach (object ob in obs)
{
foreach (object dataOb in data)
if (ob.ToString() == dataOb.ToString())
{
... // do something with dataOb
goto ContinueOuter;
}
throw new Exception("No matching data found.");
ContinueOuter: ;
}
欠点は、私は不必要であるたびに、dataOb.ToString()
計算することである。ここでは
IDictionary<object, string> dataToDataStr = new Dictionary<object, string>();
foreach (object dataObj in data) // collect all ToString values in advance
dataToDataStr.Add(dataObj, dataObj.ToString());
foreach (object ob in obs)
{
foreach (object dataOb in dataToDataStr.Keys)
if (ob.ToString() == dataToDataStr[dataOb])
{
... // do something with dataOb
goto ContinueOuter;
}
throw new Exception("No matching data found.");
ContinueOuter: ;
}
欠点は、それが必要ではないかもしれないにもかかわらず、私はすべてのToString()
値を計算することです。私は、データ収集の前半にすべての一致するデータオブジェクトを見つけるかもしれません。
どのようにしてdataToDataStr
辞書(またはオブジェクトと唯一計算済みのToString値の両方を取得できる他の列挙可能なデータ構造)を遅延して構築できますか?ここで
は、私は心の中で持っているもののコード(擬似コードと混合)である:
IDictionary<object, string> dataToDataStr = new Dictionary<object, string>();
object lastProcessedDataOb = null;
foreach (object ob in obs)
{
foreach (object dataOb in dataToDataStr.Keys)
if (ob.ToString() == dataToDataStr[dataOb])
{
... // do something with dataOb
goto ContinueOuter;
}
foreach (object dataOb in data STARTING AFTER lastProcessedDataOb)
// if lastProcessedDataOb == null, start with the first entry of data
{
dataToDataStr.Add(dataOb, dataOb.ToString();
lastProcessedDataOb = dataOb;
if (ob.ToString() == dataToDataStr[dataOb])
{
... // do something with dataOb
goto ContinueOuter;
}
}
throw new Exception("No matching data found.");
ContinueOuter: ;
}
data
は、インデックス付きのアクセスとLinkedList
または任意のコレクションだった(その後、私はリンクを保存することができれば、私はそれが簡単である知っていますリストノードまたはインデックスはlastProcessedDataOb
)、そうではありません - IEnumerable
です。多分yield return
をここで使用できますか?
...このような複雑さの価値である、「ToStringメソッド」は単なる例のためのものであり、あなたはそこにいくつかの複雑な計算を持っていることを望みます場所。それは間違っていると感じます。なぜEquals/GetHashcodeを実装する標準的な方法や、IEquatable/IComparableインターフェイスの適切な実装を使用しないのですか?実装には、計算が高価な場合はキャッシュ機構が含まれている可能性があります。そうすれば、そのようなクラスのユーザーはもっと楽になります。 – Ralf
あなたのコメントは質問のポイントとは関係ありません(列挙可能なlazily)。また、私は次のように書いています。「ある特定のプロパティで同じ値を持つデータの最初の項目をob [...] 'ToString' [...]」として検索する必要があります。 – Kjara