0

我编写的代码运行良好,此查询纯粹是出于教育目的。我想知道其他人如何做得更好,更干净。我特别讨厌在加入之前将列表项添加到另一个列表的方式............必须有一种更有效的方法。

我意识到一个简单的方法是将“OU=”和“DC=”及其相关文本存储在数据库中,......但这对我来说感觉不合适。

我正在为 LDAP 调用的 PrincipalContext 类的容器参数构建一个字符串。

“lst”列表<string>包含 LDAP 组织单元的 DataRows,例如“Accounts”、“Users”等

// Get ou list
List<string> lst = db.sda(sql).Rows.OfType<DataRow>().Select(dr => dr.Field<string>("txt")).ToList()

string OU = string.Empty;
List<string> lst = new List<string>();

foreach (string ou in Web.Info.Ldap.ouList)
{
    lst.Add("OU=" + ou);                    //  6th revision .... this works, but wasn't as good as I thought it should be
    lst.Add(string.Format("OU={0}", ou));   //  7th revision .... this works as well, but I thought it could be done better, which is why I am here.
}
OU = string.Join(",", lst);                 //  born of 6th revision, used in 7th also 

结果:“OU=Users,OU=Accounts,OU=Employees”

我对一个名为 dcList 的列表做同样的事情,它产生相同类型的字符串

DC = string.Join(",", lst); 

结果:“DC=severname,DC=another_value,DC=com”;

我与OU一起加入以获得完整的字符串,就像这样

string container = string.Join(",", OU, DC);

最终结果:“OU=Users,OU=Accounts,OU=Employees,DC=sever,DC=othervalue,DC=com”

感谢您的时间和知识。

4

2 回答 2

0

您可以使用string.Join()带参数的重载IEnumerable<string>

OU = string.Join(",",
    Web.Info.Ldap.ouList.Select(text => string.Format("OU={0}", text)));

有关详细信息,请参阅String.Join 方法(字符串,IEnumerable)

于 2014-11-28T04:23:41.520 回答
0

您正在创建一些不需要的中间字符串。除非您经常这样做,否则性能影响可能不会那么大。您正在分配 GC 必须去清理的内存,因此如果有很多内存,则收集需要更长的时间。一种更有效的方法可能是在完成后使用StringBuilder并且只创建一次字符串。

StringBuilder builder = new StringBuilder();
foreach (string ou in Web.Info.Ldap.ouList)
{
    builder.Append("OU=").Append(ou).Append(",");
}

foreach (string dc in Web.Info.Ldap.dcList)
{
    builder.Append("DC=").Append(dc).Append(",");
}

if (builder.Length > 0)
    builder.Length--; // remove the trailing comma
string container = builder.ToString();
于 2014-11-28T04:24:42.423 回答