我写的代码工作得很好,这个查询纯粹是出于教育目的。我想知道其他人如何做得更好,更干净。我特别讨厌在加入之前将列表项添加到另一个列表中的方式..........必须有一种更有效的方式。
我意识到一个简单的方法就是将这个简单存储起来" OU ="和" DC ="在数据库及其相关文本中,.....但这对我来说感觉不合适。
我正在构建一个用于LDAP调用的PrincipalContext类的容器参数的字符串。
" lst" List< string> 包含LDAP组织单位的数据行,例如"帐户","用户"等
// 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
结果:&#34; OU =用户,OU =帐户,OU =员工&#34;
我对名为dcList的列表执行相同的操作,该列表生成相同类型的字符串
DC = string.Join(",", lst);
结果:&#34; DC = severname,DC = another_value,DC = com&#34 ;;
我和OU一起加入以获得完整的字符串,就像这样
string container = string.Join(",", OU, DC);
最终结果:&#34; OU =用户,OU =帐户,OU =员工,DC =服务器,DC =其他值,DC = com&#34;
感谢您的时间和知识。
答案 0 :(得分:0)
您可以使用带有string.Join()
参数的IEnumerable<string>
重载:
OU = string.Join(",",
Web.Info.Ldap.ouList.Select(text => string.Format("OU={0}", text)));
有关详细信息,请参阅String.Join Method (String, IEnumerable)。
答案 1 :(得分: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();