Для решения первой проблемы ботов, хлопающих первой полосой, попытайтесь делать ловушку точно тем же как реальный мешок дерьма. Заставьте разметку HTML для первой полосы включать ту же разметку, как будто это было для мешка дерьма, но делает это скрытым. Это вынудило бы ботов включать механизмы CSS, чтобы определить, отображен ли мешок загаженного кода или скрыт. С другой стороны, Вы могли только произвести этот 'поддельный' мешок загаженного HTML случайное количество времени (часы?), прежде чем реальный мешок дерьма повышается. Это заставило бы ботов поднять тревогу слишком скоро (но не знать как скоро).
Для покрытия второго шага того, чтобы на самом деле покупать мешок дерьма добавьте простые вопросы. Я предпочитаю вопросы о здравом смысле вопросам о математике, предложенным выше. Вещи как, "Лед является горячим или холодным?" "Муравьи являются большими или маленькими"? Конечно, их должны были бы рандомизировать и вытянуть от бесконечного предоставления вопросов, еще боты могли быть запрограммированы для ответа на них. Этими вопросами, тем не менее, является все еще намного меньше раздражения, чем КАПЧИ.
Если вы можете использовать LINQ, тогда метод Cast
сделает то, что вам нужно:
List<string> listString = listObject.Cast<string>().ToList();
Вы также можете использовать метод ConvertAll
, как Стэн указывает в своем ответе:
List<string> listString = listObject.ConvertAll(x => (string)x);
Если вы Если вы не используете C # 3, вам нужно будет использовать "старый" синтаксис делегата вместо лямбда:
List<string> listString =
listObject.ConvertAll(delegate(object x) { return (string)x; });
Если вы используете .NET 3.5, вы можете использовать, таким образом вам не нужно делать лишний ToList (). Вы также можете предоставить свой собственный конвертер, если вам нужно преобразовать расширенные объекты.
List<string> listString = listObject.ConvertAll(x=> x as String);
Если вы не можете использовать LINQ, вы можете сделать это
foreach(object item in listObject)
{
string convertedItem = item as String;
if(convertedItem != null)
listString.Add(convertedItem);
}
Как насчет этого:
public static List<T> ConvertToGenericList<T>(IList listOfObjects)
{
List<T> items = new List<T>();
for (int i = 0; i < listOfObjects.Count; i++)
{
items.Add((T)listOfObjects[i]);
}
return items;
}
Использование:
List<object> listObject = new List<object>();
listObject.Add("ITEM 1");
listObject.Add("ITEM 2");
listObject.Add("ITEM 3");
List<string> listString = Converter.ConvertToGenericList<string>(listObject);
Я не думаю, что вы можете сделать это за один шаг. Вместо этого попробуйте что-нибудь вроде этого:
List<object> listObject = new List<object>();
listObject.Add( "ITEM 1" );
listObject.Add( "ITEM 2" );
listObject.Add( "ITEM 3" );
List<string> lstStr = new List<string>( listObject.Count );
foreach ( object obj in listObject )
{
lstStr.Add( obj.ToString() );
}
List<string> listString = (from o in listObject select (string)o).ToList();