2

私がこのようなオブジェクトを持っていると仮定します:

Class NetworkSwitch
{  
   private String _name; 
   String name { get {return _name;} set {_name=value;}}
   Dictionary<int, VLAN> VLANDict = new Dictionary<int, NetworkSwitch>();

public List<CiscoSwitch> GetAllNeigbors()
         {
           List<CiscoSwitch> templist = new List<CiscoSwitch>();

        foreach (KeyValuePair<int, CiscoVSAN> vlanpair in this.VLANDict)
        {

            templist.AddRange((vlanpair.Value.NeighborsList.Except(templist, new SwitchByNameComparer())).ToList());
        }
        return templist;
}

Class VLAN
{ 
  private Int _VLANNum;
  Int VLANNum {get {return _VLANNum ;} set {_VLANNum =value;}}

  //a neighbor is another switch this switch is connected to in this VLAN
  // the neighbor may not have all same VLANs
  List<NetworkSwitch> Neighbors = new List<NetworkSwitch>();
}

上記は、物理的に接続されている2つのスイッチにすべて同じVLANが割り当てられていない可能性があるため、そのように設計されています。私がやろうとしているのは、特定のスイッチの各VLANのネイバーリストをステップスルーし、名前が入力リストの1つと一致する場合は、別のスイッチへの参照を更新することです。これが私が試したもので、コンパイルされません。LINQが何らかの形でそれを実行できるのか、それともより良いアプローチがあるのか​​疑問に思います。

// intersect is the input list of NetworkSwitch objects
//MyNetworkSwitch is a previously created switch

foreach (NetworkSwitch ns in intersect)
{
  foreach (KeyValuePair<int, VLAN> vlanpair in MyNetworSwitch.VLANDict)
  {
      foreach (CiscoSwitch neighbor in vlanpair.Value.Neighbors)
      {   // this is the line that fails - I can't update neighbor as it is part of the foreach
          if (ns.name == neighbor.name) { neighbor = ns; }
      }
  }
}

別の質問-NetworkSwitchオブジェクトのすべてのネイバーを取得するメソッドを追加しました。そのリストを取得し、同じ名前のスイッチの別のインスタンスへの参照で更新すると仮定すると、NetworkSwitchオブジェクトのVLAN内の参照が更新されますか?

4

2 に答える 2

0

このようなものが機能するはずです:

        foreach (NetworkSwitch ns in intersect) 
        {   
            foreach (KeyValuePair<int, VLAN> vlanpair in ns.VLANDict)
            {
                if(vlanpair.Value.Neighbors.RemoveAll(n => n.name == ns.name) > 0)
                    vlanpair.Value.Neighbors.Add(ns);
            } 
        } 
于 2012-08-13T20:22:37.417 に答える
0

仕組みIEnumerable上、Enumerable の反復処理中に Enumerable の内容を変更することは、サポートされているアクションではありません。

変更された値を含む新しいリストを返し、元の参照を更新するか、単純なfor (...; ...; ...)ループを使用する必要があります。

于 2012-08-13T20:11:01.720 に答える