我有这些词典:
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();
我再次收到编译器警告。我不确定要指定的类型或指定方式。
答案 0 :(得分:1)
假设没有拼写错误,则会出现语法错误:部分.Where ( => cs )
是非法的。你试图在这里表达什么?
编辑:
实际上,要想一想,你的整个表达都是非法的或错误的。
您传递给SelectMany的委托应返回IEnumerable<T>
,但您的表达式返回CiscoVSAN
答案 1 :(得分:0)
我明白了:
var selectmany = this.VSANList.Values.SelectMany(vs => vs.MemberSwitches).Where(cs => cs.Value.switchName == RemoteSwitchName).First();