使用SelectMany()展平字典字典

时间:2012-08-19 22:36:46

标签: c# linq dictionary

我有这些词典:

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

我再次收到编译器警告。我不确定要指定的类型或指定方式。

2 个答案:

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