IDictionary <TKey, TValue> в.NET 4 не ковариантный

IDictionary в.NET 4 / Silverlight 4 не поддерживает ковариантность, т.е. Я не могу сделать a

IDictionary myDict = new Dictionary();

аналог к тому, с чем я могу сделать IEnumerables теперь.

Вероятно, сводится к KeyValuePair не быть ковариантным также. Я чувствую, что ковариантность должна быть позволена в словарях, по крайней мере, для значений.

Таким образом, это - ошибка или функция? Это будет когда-либо прибывать, возможно, в.NET 37.4?

ОБНОВЛЕНИЕ (2 года спустя):

Будет IReadOnlyDictionary в.NET 4.5, но это не будет ковариантным также :·/, потому что это происходит из IEnumerable>, и KeyValuePair не интерфейс и таким образом не может быть ковариантным.

Команда BCL должна была бы перепроектировать много, чтобы подойти и использовать некоторых ICovariantPair вместо этого. Также индексаторы со строгим контролем типов а-ля this[TKey key] не возможны для ковариантных интерфейсов. Подобная цель может только быть достигнута путем размещения дополнительного метода GetValue<>(this IReadOnlyDictionary self, TKey key) где-нибудь, который должен был бы так или иначе внутренне назвать фактическую реализацию, которая возможно похожа на довольно грязный подход.

58
задан herzmeister 21 March 2012 в 11:28
поделиться

3 ответа

В Solr RequestHandler по существу является плагином (модулем логики), который обрабатывает входящие запросы определенным способом.

Вместо того, чтобы «делать» какие-то вещи с фактически поисковым запросом, обработчики запросов могут предоставлять функциональные возможности помимо запросов, например, импорт данных.

Обычно обработчики запросов в Solr конфигурируются как определенные конечные точки (т.е. URL), но не выбираются с помощью параметра qt . Однако конкретные обработчики поиска могут использовать параметр типа запроса для обработки запроса определенным способом (то есть один обработчик может иметь возможность обрабатывать различные типы запросов).

Какой обработчик использовать, как правило, будет зависеть от того, чего вы хотите достичь. Я бы предложил вам просмотреть список предоставленных обработчиков и сопоставить их описания (у многих есть вики-страницы) с тем, что вы хотите сделать.

Для запросов, отличных от используемого по умолчанию SeureHandler, наиболее часто используемым обработчиком запросов является DisMaxRequestHandler ( qt = dismax ), который по существу обеспечивает поиск по нескольким полям с использованием различных весов на основе значимости полей. Это часто называют поиском «Google как».

Кроме того, вы можете быть заинтересованы в просмотре MureLikeThisHandler, который был разработан для предоставления хитов, похожих на определенный документ (например, из предыдущего результата поиска).

Обратите внимание на то, что в качестве источника путаницы DisMaxRequestHandler в более новых версиях Solr фактически предоставляется с типом запроса dismax .

Обработчики конфигурируются в solrconfig.xml :

<requestHandler name="dismax" class="solr.SearchHandler" >
<lst name="defaults">
 <str name="defType">dismax</str>
 <str name="echoParams">explicit</str>
 <float name="tie">0.01</float>
 <str name="qf">
    id^10.0 keyword^1.5 title^1.0 region^0.5 country^0.5 city^0.5
 </str>
 <str name="pf">
    keyword^1.5 title^1.0 region^0.5 country^0.5 city^0.5
 </str>
 <str name="bf">
 </str>
 <str name="mm">
    2&lt;-1 5&lt;-2 6&lt;90%
 </str>
 <int name="ps">100</int>
 <str name="q.alt">*:*</str>

 <!-- example highlighter config, enable per-query with hl=true -->
 <str name="hl.fl">text features name</str>
 <!-- for this field, we want no fragmenting, just highlighting -->
 <str name="f.name.hl.fragsize">0</str>
 <!-- instructs Solr to return the field itself if no query terms are
      found -->
 <str name="f.name.hl.alternateField">name</str>
 <str name="f.text.hl.fragmenter">regex</str> <!-- defined below -->
</lst>

В этом случае qf - это поля и повышения, которые должны применяться для каждого поля. Приведенная выше конфигурация будет выполнять поиск по идентификатору, ключевому слову, названию, региону, стране и городу. Ознакомьтесь с соответствующей вики-страницей для получения дополнительных сведений (применяется DisMaxRequestHandler).

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

Составители ответов - это плагины (модули логики), которые обеспечивают способы и средства записи ответов в определенных форматах. В настоящее время эта концепция применяется, главным образом, к поискам, где вы будете иметь дело с производными QuureResponseWriter, которые, в свою очередь, будут выбраны параметром формата ответа wt (в запросе).

Если вы работаете с PHP, то вам, безусловно, будет интересно генерировать дружественные PHP ответы на ваши запросы, используя wt = php или wt = phps .

Ответ php можно оценить:

$code = file_get_contents('http://localhost:8983/solr/select?q=iPod&wt=php');
eval("\$result = " . $code . ";");
print_r($result);

и ответ phps можно прочитать с помощью механизма сериализации PHP:

$serializedResult = file_get_contents('http://localhost:8983/solr/select?q=iPod&wt=phps');
$result = unserialize($serializedResult);
print_r($result);

Есть поддержка для других (например, Ruby, Python, Java Binary и т.д.),которые, по существу, были построены, чтобы облегчить для разработчиков интеграцию SOLR в их веб- прикладной с использованием механизмов, которые быстрее, чем синтаксический анализ XML или JSON.

Однако существуют и другие типы ResponseWriter, которые фактически преобразуют ответ на основе шаблона (например, Velocity) или преобразования (например, XSLT). Это может быть полезно в определенных ситуациях, когда не требуется зависеть от другого приложения для обработки результатов запроса (например, XSLT непосредственно в XHTML).

Модули записи ответов также конфигурируются в solrconfig.xml , как правило, можно включить те, которые интересуют вас, например:

<queryResponseWriter name="xml" class="org.apache.solr.request.XMLResponseWriter" default="true"/>
<queryResponseWriter name="json" class="org.apache.solr.request.JSONResponseWriter"/>
<queryResponseWriter name="php" class="org.apache.solr.request.PHPResponseWriter"/>
<queryResponseWriter name="phps" class="org.apache.solr.request.PHPSerializedResponseWriter"/>

Наиболее эффективный способ их использования зависит от вашей среды и того, чего вы хотите достичь. Очевидно, если вы находитесь в PHP, phps может дать вам лучшие (легкий доступ через язык) и более быстрые (встроенный механизм сериализации, менее подробный) результаты. Если в Javascript, json может быть просто способ идти и т.д.

Вы видите, SOLR является мощным и универсальным plattform:) Если вы хотите понять, как пройти через джунгли, вы можете обратиться к какой-нибудь книге, как «Solr 1.4 Enterprise Search Server» (хотя я не уверен, что он действительно делает лучшую возможную работу в качестве введения). Многие вещи вы можете лучше всего выяснить методом проб и ошибок, а также терпение и некоторые онлайн-помощь.

Надеюсь, это поможет вам уйти.

-121--1384555-

Оба ваших класса имеют имя «Leads». Когда CI включает их, они загружаются в одно пространство имен. Вероятно, имеется ошибка «Невозможно повторно объявить класс 'Leads'» . Попробуйте переименовать модель, и вы должны быть в порядке.

Edit: guess confirmed

-121--3223099-

Это функция. .NET 4,0 поддерживает только безопасную ковариацию. Приведенный текст потенциально опасен, так как можно добавить непоследовательности элемент в словарь, если это возможно:

IDictionary<string, object> myDict = new Dictionary<string, string>();
myDict["hello"] = 5; // not an string

С другой стороны, IEnumerable < T > является интерфейсом только для чтения. Параметр типа T находится только в его выходных позициях (возвращаемый тип свойства Current ), поэтому можно безопасно рассматривать IEnumerable < строка > как IEnumerable < объект > .

50
ответ дан 7 November 2019 в 05:35
поделиться

Это функция. .Net 4.0 поддерживает только безопасную ковариация. Упомянутое литье, потенциально опасно, поскольку вы можете добавить не строковый элемент в словарь, если это было возможно:

IDictionary<string, object> myDict = new Dictionary<string, string>();
myDict["hello"] = 5; // not an string

С другой стороны, IENumerable - это интерфейс только для чтения. Параметр T Тип находится только в его выходных позициях (тип возврата тока тока ), так что безопасно лечить IENumerable как IEnumerable <Объект> .

-121--981563-

Но тогда вы могли бы сказать

myDict.Add("Hello, world!", new DateTime(2010, 1, 27));

, который бы не провалился несчастно. Вопрос в том, что TVALUE TVALUE в IdsictionAry используется как на входных, так и на выходе. К острому:

myDict.Add(key, value);   

и

TValue value = myDict[key];

так и

TValue value = myDict[key];

так, что ошибка или особенность?

Это по дизайну.

Это когда-нибудь придет, может быть, в .NET 37.4?

Нет, это небезопасно.

11
ответ дан 7 November 2019 в 05:35
поделиться

.NET 4 поддерживает только ковариация в . Работает с iEnumerable, потому что IENumerable только для чтения.

2
ответ дан 7 November 2019 в 05:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: