私はこれらの辞書を持っています:
public class CiscoVSAN
{
private string _VSANName;
private string _VSANNum;
public string VSANName{ get{return _VSANName;} set{_VSANName=value;} }
public string VSANNum{ get{return _VSANNum;} set{_VSANNum=value;} }
public Dictionary<int, CiscoSwitch> MemberSwitches = new Dictionary<int, CiscoSwitch>();
}
public Dictionary<int, CiscoVSAN> VSANList = new Dictionary<int, CiscoVSAN>();
このforeachを置き換えようとしています
foreach (KeyValuePair<int, CiscoVSAN> vsanpair in this.VSANList)
{
var currSwitchAsEnumerable = vsanpair.Value.MemberSwitches.Where(cs => cs.Value.switchName == RemoteSwitchName);
if (currSwitchAsEnumerable != null)
{
//currVSAN.MemberSwitches.Add(DomainID, currSwitchAsEnumerable.FirstOrDefault().Value);
currSwitch = currSwitchAsEnumerable.FirstOrDefault().Value;
break;
}
}
外側のディクショナリに SelectMany を使用します。条件に一致する MemberSwitches の最初の一致が必要です。すべての VSAN が、それぞれのディクショナリに同じメンバー スイッチを持っているわけではありません。私はこれを試しました:
var selectmany = this.VSANList.SelectMany(cs => cs.Value).Where( => cs).Where(cs.Value.SwitchName == RemoteSwitchName).First();
この:
var selectmany = this.VSANList.Values.SelectMany(cs => cs.Value).Where( => cs).Where(cs.Value.SwitchName == RemoteSwitchName).First();
しかし、コンパイラが私に言うたびに、使用法から型引数を推測することはできません. SelectMany ステートメントの後に型引数を入力しようとしましたが、それもうまくいきませんでした。私が見た例のほとんどは、リストのフラット化されたリストまたは単純な辞書のいずれかでした。また、SelectMany で型を指定しませんでした。
追加するために編集して、これを試しました:
Dictionary<int, List<string>> mydict = new Dictionary<int, List<string>>();
var selectlist = mydict.Values.SelectMany(n => n).ToList();
型の推論に関するコンパイラ エラーは発生しませんでした。それで、辞書をフラットにしてリストに変えるために、これを試しました:
var selectmany = this.VSANList.Values.SelectMany(vs => vs).ToList();
コンパイラの警告が再び表示されます。指定する型や指定方法がわかりません。