Я просто не понимаю, как использовать Linq

У меня есть класс следующим образом:

Class Scan
    Delivered As Boolean
    ScanDate As Date
    State As String
    Facility As String  
End Class

Я затем создаю список и заполняю его со сканированиями, содержащими безотносительно.

Dim Scans As New List(Of Scan) 

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

Как мог я

  1. Получите количество сканирований, сгруппированных по дате, где Поставлено = Верный
  2. Получите количество сканирований, сгруппированных Средством, где Поставлено = Верный
  3. Получите количество сканирований, сгруппированных состоянием, где Поставлено = Верный

Я затем хочу использовать это в Для Каждого цикла.

For Each result In GroupedResults
    ‘My Code

Next

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

Кто-либо может рекомендовать некоторым ссылкам начать с этим? Каждый веб-сайт, с которым я сталкиваюсь просто, получает мое главное плавание. Я не понимаю это вообще.

Править:

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

Я надеялся, что этот простой пример поможет мне пружинная плата в более сложное использование – никакая удача все же. Я должен был спросить это от летучей мыши.

Все примеры, кажется, используют ответ ключа/значения. В чем, если у меня есть два значения, я нуждаюсь сгруппированный?

    Class Scan
        Delivered As Boolean
        Scanned As Boolean
        ScanDate As Date
        State As String
        Facility As String  
    End Class


1. Get a count of Delivered = True,  a count  of Scanned=True, grouped by Date 
2. Get a count of Delivered = True,  a count  of  Scanned=True, grouped by Facility 
3. Get a count of Delivered = True,  a count  of Scanned=True, grouped by State 

Действительно ли возможно получить это в одном результате?

Редактирование редактирования:

Отвеченный на мое собственное Редактирование! Это, кажется, работает на меня:

Dim query = From r In scans _
            Group r By r.ScanDate Into g = Group _
            Select New With _
            {g, .DeliveredCount = g.Count(Function(s) s.Delivered), .ScannedCount = g.Count(Function(s) s.Scanned)}

Огромное спасибо парни. Вы получили меня до такой степени, когда, я мог вырубить решение. Я все еще не “получаю” то, что я делаю (Что такое Функция (функции)?!), но у меня есть что-то для запуска с. Я намереваюсь провести время, изучая это теперь. Я думаю, что действительно отбросило меня, то, что образцы в сети являются C#. Normaly у меня нет проблемы при преобразовании синтаксиса, но с LINQ, это не столь просто. Я думал, что делал что-то не так, но это было просто, что синтаксис очень отличался.

5
задан Brett 29 January 2010 в 21:39
поделиться

4 ответа

Вы не ограничены использованием синтаксиса запроса LINQ. Вы также можете использовать методы расширения LINQ на коллекциях.

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

Код ниже является C #, но вы поймете:

static void Main( string[] args )
{
    List<Scan> scans = new List<Scan> ();

    scans.Add (new Scan (new DateTime (2010, 1, 1), true, "Facility1"));
    scans.Add (new Scan (new DateTime (2010, 1, 1), true, "Facility2"));
    scans.Add (new Scan (new DateTime (2010, 1, 1), false, "Facility3"));
    scans.Add (new Scan (new DateTime (2010, 1, 26), true, "Facility1"));

    var result1 = scans.Where (s => s.Delivered).GroupBy (s => s.ScanDate);

    foreach( var r in result1 )
    {
        Console.WriteLine (String.Format ("Number of delivered scans for {0}: {1}", r.Key, r.Count ()));
    }

    var result2 = scans.Where (s => s.Delivered).GroupBy (s => s.Facility);

    foreach( var r in result2 )
    {
        Console.WriteLine (String.Format ("Number of delivered scans for {0}: {1}", r.Key, r.Count ()));
    }

    Console.ReadLine ();

}

Результат здесь на самом деле не набирает, поскольку выражение группы возвращает тип игруппию. Однако вы можете обойти это, делая это:

 var result2 = scans.Where (s => s.Delivered)
                    .GroupBy (s => s.Facility)
                    .Select( s => new { Facility = s.Key, NumberOfItems = s.Count() } );

Использование методов расширения, которые предоставляет LINQ, возможно, может помочь вам понять его немного больше.

Извините за синтаксис C #, но я не совсем знаком с VB.NET.

4
ответ дан 14 December 2019 в 08:50
поделиться
Dim GroupedResults = from s in Scans _
                     where Delivered _
                     group s by ScanDate into g //edit here for the others _
                     select new { Category = g.Key, ScanCount = g.Count() };

Извинения, если C # к конвертации VB неверно!

2
ответ дан 14 December 2019 в 08:50
поделиться

Я думаю, что для «наиболее компактного способа» вам потребуется некоторое сжатие, но Huffman Coding может не быть способом, как я думаю, он лучше всего работает с алфавитами, которые имеют статические частоты на символ.

Проверьте Арифметическое кодирование - оно работает на битах и может адаптироваться к динамическим входным вероятностям. Я также вижу, что есть BSD-лицензированная Java библиотека , которая сделает это для вас, которая, кажется, ожидает одни биты в качестве входных данных.

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

-121--2771400-

Принципал тот же, независимо от того, называется ли он:

  • номер автобуса
  • номер грузовика
  • коэффициент автобуса
  • коэффициент грузовика
  • и др.

Кроме того, принципал является тем же, независимо от того, описываете ли вы его, используя большее число, как лучше или меньшее число, как лучше:

  • Высокий номер автобуса является хорошим, если вы описываете количество членов проекта, которые могут быть сбиты автобусом и проект выживет;
  • Низкий номер автобуса является хорошим, если вы описываете количество членов проекта, которые пережили аварию автобуса и проект выжил.

Я изучал это когда-то, но не помню, что пришло первым (см. ответ @ Paolo). Независимо от того, кто пришел первым, я испытал достаточно путаницы, чтобы убедиться, что все стороны используют одну и ту же версию числа, высокую или низкую.;)

-121--2789857-

Я наткнулся на ту же путаницу. Согласен, что документация не очень понятна. Сейчас я использую LINQ в трех проектах, и мне это скорее нравится.

При использовании LINQ в SQL создайте класс LINQ, создав соединение с сервером в представлении сервера и перетащив таблицу в контекст данных. В противном случае просто задайте db как коллекцию объектов сканирования.

1) Получить число сканирований, сгруппированное по дате доставки = True

Dim db = new BrettsDataContext
Dim Query = From s as Scan in db _
Where s.Delivered = True _
Order By s.Date

2) Получить число сканирований, сгруппированное по объекту, где Delivered = True

Dim db = new BrettsDataContext
Dim Query2 = From s as Scan in db _
Where s.Delivered = True _
Order By s.Date

3) Получить число сканирований, сгруппированное по состоянию, где Delivered = True

Dim db = new BrettsDataContext
Dim Query3 = From s as Scan in db _
Where s.Delivered = True _
Order By s.State

Последняя получит все строки результата. Если вы просто хотите, чтобы число:

Dim count = (From s as Scan in db _
Where s.Delivered = True).Count

Если вы хотите все отдельные даты доставки, вы можете сделать следующий запрос:

Dim db = new BrettsDataContext
Dim Query4 = From s as Scan in db _
Where s.Delivered = True _
Order By DeliveryDate

Чтобы установить в качестве источника данных, просто сделайте следующее:

Dim db = new BrettsDataContext
Dim Query = From s as Scan in db _
Where s.Delivered = True _
Order By s.Date

gridview1.DataSource = Query

Надеюсь, это поможет!

1
ответ дан 14 December 2019 в 08:50
поделиться

Если вы хотите использовать LINQ, я бы предложил прочитать эту страницу на использовании LINQ с объектами (например, свой класс Scan):

http://msdn.microsoft.com/ EN-US / Библиотека / BB397937.aspx

Это должно быть достаточно простым, чтобы понять, не вызывая головы для вращения. :)

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

http://msdn.microsoft.com/en-us/library/d9hw1as6.aspx

0
ответ дан 14 December 2019 в 08:50
поделиться
Другие вопросы по тегам:

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