-4

我有这些字典:

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();

我再次收到编译器警告。我不确定要指定什么类型或如何指定它。

4

2 回答 2

1

假设没有拼写错误,您有一个语法错误:该部分.Where ( => cs )是非法的。你想在这里表达什么?

编辑:

实际上,仔细想想,你的整个表达都是非法的或输入错误的。

您传递给 SelectMany 的委托应该返回IEnumerable<T>,但您的表达式返回CiscoVSAN

于 2012-08-19T22:50:28.797 回答
0

我想到了:

var selectmany = this.VSANList.Values.SelectMany(vs => vs.MemberSwitches).Where(cs => cs.Value.switchName == RemoteSwitchName).First();
于 2012-08-20T00:51:07.643 回答