如果我表示我想做的话更容易:
public struct Server
{
public string ServerName;
public string SiteName;
}
List<Server> targetServerList = GetTargetServerList();
targetServerList将包含以下数据:
SiteName: A
ServerName: 1
SiteName: A
ServerName: 2
SiteName: B
ServerName: 3
SiteName: C
ServerName: 4
目标:我需要创建一个包含以下内容的列表:
SiteName: Site A
ServerNames: 1,2
SiteName: Site B
ServerNames: 3
SiteName: Site C
ServerNames: 4
所以我创建了以下类:
private class ServersPerSite
{
string ServerNames;
string SiteName;
}
所以现在我需要循环并添加一个带有新SiteName的新项目,如果SiteName尚不存在,再加上ServerName。如果确实存在,我只需要添加ServerName:
foreach (Server server in targetServerList)
{
//??missing code
}
我该怎么做?在Javascript中非常简单:
//Separate the servers per site
var sites=new Object();
$("#ServerGrid").jqGrid('getGridParam', 'data').forEach(function(row)
{
if(!sites[row.SiteName])
{
sites[row.SiteName] = new Array();
}
sites[row.SiteName][sites[row.SiteName].length] = row.ServerName;
}
谢谢!
答案 0 :(得分:4)
您可以使用GroupBy
方法使用LINQ:
var result = targetServerList
.GroupBy(s => s.SiteName)
.Select(g => new ServersPerSite()
{
SiteName = "Site " + g.Key,
ServerNames = string.Join(",", g);
});
修改:结果为Dictionary
targetServerList.GroupBy(s => s.SiteName)
.ToDictionary(g => "Site " + g.Key,
g => string.Joins(",", g));
答案 1 :(得分:1)
在这种情况下,Dictionary<string, string>
甚至Dictionary<string, IList<string>>
将是更好的选择。
public struct Server
{
public string ID;
public string SiteName;
}
private IDictionary<string, IList<string>> servers;
foreach(var server in GetTargetServerList()){
if(!servers.ContainsKey(server.SiteName) {
servers.Add(server.SiteName, new List<string>());
}
servers[server.SiteName].Add(server.ID);
}