У меня есть класс следующим образом:
Class Scan
Delivered As Boolean
ScanDate As Date
State As String
Facility As String
End Class
Я затем создаю список и заполняю его со сканированиями, содержащими безотносительно.
Dim Scans As New List(Of Scan)
Я должен взорвать список для получения различных сведений. Я хотел бы использовать LINQ, чтобы сделать это. Проблема состоит в том, что ни за что в жизни, я просто не получаю его. Синтаксис отбрасывает меня, то, что результаты не со строгим контролем типов, бросает меня прочь, и образец в сети упрощен или сверхсложный.
Как мог я
Я затем хочу использовать это в Для Каждого цикла.
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, это не столь просто. Я думал, что делал что-то не так, но это было просто, что синтаксис очень отличался.
Вы не ограничены использованием синтаксиса запроса 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.
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 неверно!
Я думаю, что для «наиболее компактного способа» вам потребуется некоторое сжатие, но 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
Надеюсь, это поможет!
Если вы хотите использовать LINQ, я бы предложил прочитать эту страницу на использовании LINQ с объектами (например, свой класс Scan):
http://msdn.microsoft.com/ EN-US / Библиотека / BB397937.aspx
Это должно быть достаточно простым, чтобы понять, не вызывая головы для вращения. :)
В противном случае я бы предложил использовать сам класс списка, который имеет много полезных функций. Проверьте здесь, чтобы узнать об этом: