2015-11-24 3 views
0

Итак, у меня есть несколько записей с несколькими типами номеров и уровнями комнат. Я знаю, что этот код работает до сих пор, но я надеялся, что кто-то может показать мне более простой способ?Как подсчитать разные значения в нескольких элементах

это XML я получаю

<RETS ReplyCode="0" ReplyText="Operation Success.">      
<DELIMITER value = "09"/>      
<COLUMNS> InputEntryOrder listing_MUI matrix_unique_id RoomLevel RoomType </COLUMNS> 
<DATA> 1 74743676 74743677 U A </DATA> 
<DATA> 2 74743676 74743678 M N </DATA> 
<DATA> 3 74743676 74743679 L A </DATA> 
<DATA> 4 74743676 74743680 L N </DATA> 
<DATA> 5 74743676 74743681 U A </DATA> 
<DATA> 6 74743676 74743682 M BF </DATA> 
<DATA> 7 74743676 74743683 M E </DATA> 
<DATA> 8 74743676 74743684 M J </DATA> 
<DATA> 9 74743676 74743685 U A </DATA> 
<DATA> 10 74743676 74743686 M H </DATA> 
<DATA> 11 74743676 74743687 M K </DATA> 
<DATA> 12 74743676 74743688 M N </DATA> 
<DATA> 13 74743676 74743689 U N </DATA> 
<DATA> 14 74743676 74743690 M N </DATA> 
</RETS>      

И это C# код я работаю до сих пор, но не устраивает :(

XmlDocument doc = new XmlDocument(); 
    doc.LoadXml("<root>" + ResponseText + "</root>"); 
    XmlNode mlsNode = doc.SelectSingleNode("//RETS"); 

    //bool MasterBedroom = false; 
    int UtilityRoomCountM = 0; 
    int UtilityRoomCountU = 0; 
    int UtilityRoomCountL = 0; 
    int UtilityRoomCountG = 0; 

    int DwellingUnitU = 0; 
    int DwellingUnitM = 0; 
    int DwellingUnitL = 0; 

    foreach (XmlNode node in mlsNode.ChildNodes) 
    { 
     if (node.Name == "DATA") 
     { 
      string[] splitData = node.InnerText.Split("\t".ToCharArray()); 
      string ResponseD = node.InnerText; 
      RoomName = splitData[10]; 
      RoomValue = splitData[8]; 

       switch (RoomName) 
       { 
        case "M": 
         if (RoomName == "N") 
          UtilityRoomCountU++; 
         else 
          DwellingUnitU++; 
         break; 
        case "L": 
         if (RoomName == "N") 
          UtilityRoomCountM++; 
         else 
          DwellingUnitM++; 
         break; 
        case "U": 
         if (RoomName == "N") 
          UtilityRoomCountL++; 
         else 
          DwellingUnitL++; 
         break; 
       } 

      } 
    } 
    // outside the loop 
    // Do the Utiltiy Room Here so you can count 
    // these are other fucntion which just set's the value back to my forms 
    SetField("UtilityRoomUpper", UtilityRoomCountU.ToString()); 
    SetField("UtilityRoomMain", UtilityRoomCountM.ToString()); 
    SetField("UtilityRoomLower", UtilityRoomCountL.ToString()); 
    SetField("UtilityRoomGarage", UtilityRoomCountG.ToString()); 

    SetField("DwellingUnitUpper", DwellingUnitU.ToString()); 
    SetField("DwellingUnitMain", DwellingUnitM.ToString()); 
    SetField("DwellingUnitLower", DwellingUnitL.ToString()); 

я была надежда, вместо того, чтобы объявить так много счетчиков, где я могу найти все типы номеров N и сколько M (основной), L (нижний), U (верхний) и то же относится к другим типам комнат, например A!

+0

Я вижу 'переключатель (RoomName)', то 'если (RoomName' - это правильно? –

+0

Да, идея была в том, что RoomName = n, а затем count else if roomname = A, а затем count else, если Roomname = BF, а затем подсчет, и так далее, я делаю разные подсчеты для каждой комнаты. Название и как много записей найдено на каждом уровне, помогает ли это –

ответ

0

Я действительно не положительно, это бет чем то, что у вас есть, но вы можете создать массив массивов и выполнить над ним действие select и получить счет оттуда.

+2

Это не ответ .. это должен быть комментарий, не говоря уже о том, что вы не предоставляете, а также пример или альтернативу для поддержки вопроса OP – MethodMan

0

Я думаю, что вы можете создать класс для представления каждой записи, например, «Комната».

public class Room 
     { 
      public string RoomType; 
      public string RoomLevel; 

     } 

Создание объекта для класса в цикле задает свойства и добавляет их в список.

Еогеасп (XmlNode узел в нодлисте)

 { 
      Room r = new Room(); 
      string[] splitters = new string[] { @" " }; 
      r.RoomLevel = node.InnerText.Split(splitters, StringSplitOptions.None)[3]; 
      r.RoomType = node.InnerText.Split(splitters, StringSplitOptions.None)[5]; 
      roomList.Add(r); 
     } 

Тогда вы можете рассчитывать независимо логику, которую путем фильтрации из списка

//Apply the logic whatever yuo want 
       roomList.Count(r => r.RoomLevel == "M" && r.RoomType == "L"); 
+0

изменить разделительные символы и индекс столбца на основе вашего требования – Venkatesh