2014-11-28 4 views
0

Код, который я написал, отлично работает, этот запрос предназначен исключительно для образовательных целей. Я хочу знать, как другие будут делать это лучше, чище. Я особенно ненавижу то, как я добавляю элементы списка в другой список, прежде чем они будут объединены .......... должен быть более эффективный способ.Как присоединиться к строкам из списка <string>, а также их форматировать?

Я понимаю, что простой способ сделать это простым было бы хранить «OU =» и «DC =» в базе данных с их ассоциированным текстом ..... но это просто неприлично для меня.

Я создаю строку для аргумента контейнера класса PrincipalContext для вызова LDAP.

"ЛСТ" Список < строка > содержит DataRows Единиц 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 

Результат: «OU = Users, OU = Accounts, OU = Сотрудники»

я сделать то же самое в списке под названием dcList, который производит такую ​​же строку

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

Результат: "DC = имя_терминала, DC = другое_значение, DC = com";

, к которому я присоединяюсь вместе с OU, чтобы получить полную строку, например, так

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

Конечный результат: «OU = Users, OU = Accounts, OU = Служащие, DC = север, DC = othervalue, DC = com "

Спасибо за ваше время и знания.

+2

Если ваш код работает и вы ищете улучшения, рассмотрите возможность публикации на http://codereview.stackexchange.com/ вместо Stack Overflow. –

+0

Спасибо, не знал, что было такое. – user3071434

ответ

0

Вы можете использовать string.Join() перегрузку, которая принимает IEnumerable<string> аргумент:

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

См String.Join Method (String, IEnumerable) для более подробной информации.

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();