我有一個SQL查詢,爲我提供我的數據,我有時應該有行應該被聚集(數據與命令對齊)。數據按字段CAPName分組。逐行瀏覽這些行,我需要決定是否應該啓動一個新列表(CAPName的內容與之前的迭代不同),還是應該添加(已經)啓動的列表(來自之前的迭代)。
我的痛苦在於relatedCapabilitySystem列表聲明的位置。
我想在if語句中聲明它(因爲,正如我所說的,我需要決定是否應該添加上一次迭代的列表,或者是否應該啓動一個新列表),但是我不能編譯器會拋出一個異常,因爲RLCapSys.Add(rCs);
在這個內容中是不存在的(這在理論上是正確的)。我明白爲什麼編譯器會拋出這個異常。但是,如果我在「更高」級別聲明該列表,那麼我總是會有一個新列表,如果該項目應該添加到迭代中定義的列表中(1個或更多)
所以我想實現的是,生成列表RLCapSys並添加到它,以防上一次迭代包含相同的CAPName(用於集羣),否則創建一個新列表。c#如何決定是否要添加到子列表或開始新的
SqlCommand cmdDetail = new SqlCommand(SQL_SubSytemsToCapability, DBConDetail);
SqlDataReader rdrDetail = cmdDetail.ExecuteReader();
List<relatedCapility> RLCaps = new List<relatedCapility>();
string lastCapShown = null;
while (rdrDetail.Read())
{
List<relatedCapabilitySystem> RLCapSys = new List<relatedCapabilitySystem>();
if (lastCapShown != rdrDetail["CAPName"].ToString())
{
//List<relatedCapabilitySystem> RLCapSys2 = new List<relatedCapabilitySystem>();
relatedCapility rC = new relatedCapility
{
Capability = rdrDetail["CAPName"].ToString(),
systemsRelated = RLCapSys,
};
RLCaps.Add(rC);
}
relatedCapabilitySystem rCs = new relatedCapabilitySystem
{
system = rdrDetail["name"].ToString(),
start = rdrDetail["SysStart"].ToString(),
end = rdrDetail["SysEnd"].ToString(),
};
RLCapSys.Add(rCs);
// method to compare the last related Capability shown create a new related Capabilty entry or add to the existing releated Capabilty related system list
lastCapShown = rdrDetail["CAPName"].ToString();
}
DBConDetail.Close();
和原因completness的(但我覺得這裏是不是需要它):
internal class CapabilitiesC
{
public List<Capability>Capabilities{ get;set;}
}
public class Capability
{
public string name { get; internal set; }
public string tower { get; internal set; }
public string color { get; internal set; }
public List<relatedCapility> related { get; set; }
}
public class relatedCapility
{
public string Capability { get; set; }
public List<relatedCapabilitySystem> systemsRelated { get; set; }
}
public class relatedCapabilitySystem
{
public string system { get; set; }
public string start { get; set; }
public string end { get; set; }
}
Thx的提示,我忘了提及這;) 我已經試過這個通過添加上面的while循環列表。我添加了'List RLCapSys = null;'但是這會在if語句中創建一個例外。其中的內容如下:「名爲'RLCapSys'的本地或參數不能在此範圍內聲明,因爲該名稱在封閉的本地範圍中用於定義本地或參數。 –
Janbro
@Janbro:您沒有得到異常。編譯錯誤,因爲你用嵌套塊中的代碼'List RLCapSys = null;'聲明瞭一個具有相同名字的列表變量,你應該刪除內部聲明。如果你在那時需要給'列表(我不這麼認爲)你應該使用代碼'RLCapSys = null;'。這將爲你在循環外部聲明的變量賦予'null'。 –