Общая проблема для меня в C #, мое решение хорошо, глупо, разумно? (Продвинутый новичок) - PullRequest
2 голосов
/ 16 марта 2009

Хорошо, поймите, что я из Cold Fusion, поэтому я склонен думать о вещах с точки зрения CF, а C # и CF настолько различны, насколько это возможно в общем подходе.

Итак, проблема в том, что я хочу извлечь «таблицу» (вот как я это думаю) данных из базы данных SQL через LINQ, а затем я хочу выполнить некоторые вычисления в памяти. Эта «таблица» содержит 6 или 7 значений пары разных типов.

Прямо сейчас мое решение состоит в том, что я делаю запрос LINQ, используя Общий список пользовательского Типа. Итак, мой пример - RelevanceTable. Я извлекаю некоторые данные, которые я хочу сделать, чтобы некоторая оценка данных, которые сначала начинаются с .Contains. Похоже, что .Contains хочет действовать по всему списку или ничего. Так что я могу использовать его, если у меня List<string>, но если у меня List<ReferenceTableEntry>, где ReferenceTableEntry - мой пользовательский тип, мне нужно переопределить IEquatable и сообщить компилятору, что именно означает «Equals».

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

Если я хочу использовать LINQ и .Contains, является ли переопределение интерфейса единственным способом? Кажется, если есть способ просто сказать, над каким полем работать. Есть ли другой тип коллекции помимо LIST, который, возможно, имеет эту способность. Я начал много использовать List для этого, и пока я искал и смотрел, я вижу некоторые другие, но не обязательно превосходящие подходы.

Я не ищу какой-то тонкости в производительности, компактности или удобочитаемости, просто интересуюсь, использую ли я крестовую отвертку с шестигранным винтом. Если мой подход "приличный", но, конечно, не лучший, я бы хотел узнать лучше, но просто зная, что его на стадионе мало что скажет "Да! Я не глупый!" и я бы закончил хотя бы то, что я делаю полностью, прежде чем переключиться на другой метод.

Надеюсь, я объяснил это достаточно хорошо. Спасибо за помощь.

Ответы [ 4 ]

2 голосов
/ 16 марта 2009

Что именно вы хотите сделать с таблицей? Не понятно Однако стандартные методы LINQ (-to-Objects) будут доступны для любой типизированной коллекции (включая List<T>), допуская любой диапазон Where, First, Any, All и т. Д.

Итак: что вы пытаетесь сделать? Если у вас есть таблица, какие значения вы хотите?

Как предположение (на основе материала Contains) - вы просто хотите:

bool x= table.Any(x=>x.Foo == foo); // or someObj.Foo

2 голосов
/ 16 марта 2009

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

Например, для поиска элемента со свойством Id 42:

ReferenceTableEntry found = theList.Find(r => r.Id == 42);

Переменная found будет иметь ссылку на первый соответствующий элемент, или null, если элемент не найден.

Есть также некоторые расширения LINQ, которые принимают делегат или выражение. Это будет сделано так же, как метод Find:

ReferenceTableEntry found = theList.FirstOrDefault(r => r.Id == 42);
1 голос
/ 16 марта 2009

Хорошо, поэтому, если я правильно читаю, вы хотите использовать метод contains. При использовании этого с коллекциями объектов (например, ReferenceTableEntry) вы должны быть осторожны, потому что вы проверяете, чтобы проверить, содержит ли коллекция объект, который совпадает с объектом, с которым сравнивается. 1001 *

Если вы используете метод .Find () или .FindAll (), вы можете указать критерии, которым вы хотите соответствовать при использовании анонимного метода.

Так, например, если вы хотите найти все записи ReferenceTableEntry в вашем списке, у которых Id больше 1, вы можете сделать что-то вроде этого

List<ReferenceTableEntry> listToSearch = //populate list here
var matches = listToSearch.FindAll(x => x.Id > 1);

совпадений будет список записей ReferenceTableEntry с идентификатором больше 1.

Сказав все это, не совсем ясно, что это то, что вы пытаетесь сделать.

0 голосов
/ 16 марта 2009

Вот запрос LINQ, который создает объект, о котором я говорю, и строка проблемы:

.Where (searchWord => queryTerms.Contains (searchWord.Word))

List<queryTerm> queryTerms = MakeQueryTermList();

public static List<RelevanceTableEntry> CreateRelevanceTable(List<queryTerm> queryTerms)
            {
            SearchDataContext myContext = new SearchDataContext();
            var productRelevance = (from pwords in myContext.SearchWordOccuranceProducts
            where (myContext.SearchUniqueWords
            .Where (searchWord => queryTerms.Contains(searchWord.Word))
            .Select (searchWord => searchWord.Id)).Contains(pwords.WordId)
            orderby pwords.WordId
            select new {pwords.WordId, pwords.Weight, pwords.Position, pwords.ProductId});
            }

Этот запрос возвращает список WordId, которые соответствуют отправленной строке поиска (когда это был List, и это было просто слово, это прекрасно работает, потому что, как упоминал ранее ответчик, это были объекты одного типа). Мой пользовательский тип здесь - это queryTerms, список, который содержит WordId, ProductId, Position и Weight. Оттуда я продолжаю вычислять релевантность, выполняя различные операции над созданным объектом. Суммируйте «Вес» по продуктам, используйте сопоставления позиций для увеличения веса и т. Д. Моя точка зрения на то, чтобы разделить это, состояла в том, что правила выполнения этих операций изменятся, но основные факторы не будут. Я бы даже предпочел, чтобы это было БОЛЬШЕ отдельного (я все еще учусь, я не хочу увлекаться), но правила для локальных и интерпретируемых запросов LINQ, кажется, сбивают меня с толку, когда я делаю.

Поскольку CF всегда поддерживает запросы запросов, я склоняюсь к этому. Извлеките необходимые данные из базы данных, затем выполните операции (включая запросы с функциями агрегирования) в таблице в памяти.

Надеюсь, это проясняет ситуацию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...