Linq Join Group По вопросу [дубликат]

Использование рекурсивного соответствия в PHP-регулярном выражении значительно быстрее процедурного соответствия скобок. особенно с более длинными строками.

http://php.net/manual/en/regexp.reference.recursive.php

, например

$patt = '!\( (?: (?: (?>[^()]+) | (?R) )* ) \)!x';

preg_match_all( $patt, $str, $m );

vs.

matchBrackets( $str );

function matchBrackets ( $str, $offset = 0 ) {

    $matches = array();

    list( $opener, $closer ) = array( '(', ')' );

    // Return early if there's no match
    if ( false === ( $first_offset = strpos( $str, $opener, $offset ) ) ) {
        return $matches;
    }

    // Step through the string one character at a time storing offsets
    $paren_score = -1;
    $inside_paren = false;
    $match_start = 0;
    $offsets = array();

    for ( $index = $first_offset; $index < strlen( $str ); $index++ ) {
        $char = $str[ $index ];

        if ( $opener === $char ) {
            if ( ! $inside_paren ) {
                $paren_score = 1;
                $match_start = $index;
            }
            else {
                $paren_score++;
            }
            $inside_paren = true;
        }
        elseif ( $closer === $char ) {
            $paren_score--;
        }

        if ( 0 === $paren_score ) {
            $inside_paren = false;
            $paren_score = -1;
            $offsets[] = array( $match_start, $index + 1 );
        }
    }

    while ( $offset = array_shift( $offsets ) ) {

        list( $start, $finish ) = $offset;

        $match = substr( $str, $start, $finish - $start );
        $matches[] = $match;
    }

    return $matches;
}

828
задан leppie 30 September 2012 в 21:09
поделиться

12 ответов

Использовать анонимный тип.

Например

group x by new { x.Column1, x.Column2 }
1049
ответ дан leppie 21 August 2018 в 02:51
поделиться
  • 1
    Если вы новичок в группировке с анонимными типами, использование ключевого слова «новое» в этом примере делает магию. – Chris 6 August 2013 в 16:41
  • 2
    в случае mvc с ошибкой nHibernate для проблем с dll. Проблема решена GroupBy (x = & gt; new {x.Column1, x.Column2}, (ключ, группа) = & gt; new {Key1 = key.Column1, Key2 = key.Column2, Result = group.ToList ()} ); – Milan 7 December 2015 в 11:23
  • 3
    Я думал, что в этом случае новые объекты будут сравниваться по ссылке, поэтому нет совпадений - нет группировки. – HoGo 19 January 2016 в 08:57
  • 4
    @HoGo анонимные типизированные объекты реализуют собственные методы Equals и GetHashCode , которые используются при группировке объектов. – Byron Carasco 7 September 2017 в 18:57
  • 5
    Немного сложно визуализировать структуру выходных данных, когда вы новичок в Linq. Создает ли это группу, в которой в качестве ключа используется анонимный тип? – Jacques 9 October 2017 в 15:04

Хотя этот вопрос задает вопрос о свойствах класса по классу, если вы хотите группировать по нескольким столбцам в отношении объекта ADO (например, DataTable), вам нужно назначить свои «новые» элементы для переменных:

EnumerableRowCollection<DataRow> ClientProfiles = CurrentProfiles.AsEnumerable()
                        .Where(x => CheckProfileTypes.Contains(x.Field<object>(ProfileTypeField).ToString()));
// do other stuff, then check for dups...
                    var Dups = ClientProfiles.AsParallel()
                        .GroupBy(x => new { InterfaceID = x.Field<object>(InterfaceField).ToString(), ProfileType = x.Field<object>(ProfileTypeField).ToString() })
                        .Where(z => z.Count() > 1)
                        .Select(z => z);
8
ответ дан Chris Smith 21 August 2018 в 02:51
поделиться
  • 1
    Я не мог выполнить запрос Linq и группу c новым {c.Field & lt; String & gt; («Title»), c.Field & lt; String & gt; («CIF»)} & quot ;, и вы много меня спасли времени!! конечный запрос: «группа c с помощью нового {titulo = c.Field & lt; String & gt; (« Title »), cif = c.Field & lt; String & gt; (« CIF »)} & quot; – netadictos 15 August 2018 в 17:51

Вы также можете использовать Tuple & lt;> для строго типизированной группировки.

from grouping in list.GroupBy(x => new Tuple<string,string,string>(x.Person.LastName,x.Person.FirstName,x.Person.MiddleName))
select new SummaryItem
{
    LastName = grouping.Key.Item1,
    FirstName = grouping.Key.Item2,
    MiddleName = grouping.Key.Item3,
    DayCount = grouping.Count(), 
    AmountBilled = grouping.Sum(x => x.Rate),
}
15
ответ дан Jay Bienvenu 21 August 2018 в 02:51
поделиться
  • 1
    Примечание. Создание нового Tuple не поддерживается в Linq To Entities – foolmoron 26 May 2016 в 17:57

группа x с помощью нового {x.Col, x.Col}

2
ответ дан John 21 August 2018 в 02:51
поделиться
.GroupBy(x => x.Column1 + " " + x.Column2)
3
ответ дан Kai Hartmann 21 August 2018 в 02:51
поделиться
  • 1
    В сочетании с Linq.Enumerable.Aggregate() это даже позволяет группировать динамическое число свойств: propertyValues.Aggregate((current, next) => current + " " + next). – Kai Hartmann 1 August 2017 в 07:51
  • 2
    Это лучший ответ, чем кто-то заслуживает. Это может быть проблематично, если могут быть экземпляры комбинаций, в которых столбец1, добавленный в столбец2, будет одинаковым для ситуаций, когда столбец1 отличается («ab» и «cde» будет соответствовать «abc» «de»). Тем не менее, это отличное решение, если вы не можете использовать динамический тип, потому что вы предварительно создаете lambdas после группы в отдельных выражениях. – Brandon Barkley 19 April 2018 в 19:14
  • 3
    & Quot; AB & Quot; & Quot; CDE & Quot; должно фактически не соответствовать & quot; abc & quot; & quot; de & quot ;, следовательно, пробел между ними. – Kai Hartmann 8 May 2018 в 06:29

.GroupBy(x => (x.MaterialID, x.ProductID))

2
ответ дан Let's Enkindle 21 August 2018 в 02:51
поделиться
  • 1
    Подумайте о том, как добавить объяснение о том, как этот код решает проблему. – Rosário Pereira Fernandes 27 December 2017 в 15:49
  • 2
    Это не дает ответа на вопрос. Чтобы критиковать или просить разъяснения у автора, оставьте комментарий ниже их сообщения. - Из обзора – Mamun 28 December 2017 в 02:23

Для группы по нескольким столбцам, попробуйте это вместо ...

GroupBy(x=> new { x.Column1, x.Column2 }, (key, group) => new 
{ 
  Key1 = key.Column1,
  Key2 = key.Column2,
  Result = group.ToList() 
});

Точно так же вы можете добавить Column3, Column4 и т. д.

120
ответ дан Milan 21 August 2018 в 02:51
поделиться
  • 1
    Это было очень полезно и должно быть намного больше! Result содержит все наборы данных, связанные со всеми столбцами. Большое спасибо! – j00hi 15 September 2016 в 10:26
  • 2
    Это был лучший ответ, насколько мне известно - это сработало для меня. Спасибо. – GMan 17 September 2016 в 15:18
  • 3
    примечание: мне пришлось использовать .AsEnumerable () вместо ToList () – GMan 17 September 2016 в 15:19
  • 4
    Удивительно, спасибо за это. Вот мой пример. Обратите внимание, что GetFees возвращает IQueryable & lt; Fee & gt; RegistryAccountDA.GetFees (registryAccountId, fromDate, toDate) .GroupBy (x = & gt; new {x.AccountId, x.FeeName}, (ключ, группа) = & gt; new {AccountId = key.AccountId, FeeName = key.FeeName, AppliedFee = group.Sum (x = & gt; x.AppliedFee) 0M}). ToList (); – Craig B 20 September 2016 в 02:27
  • 5
    Возможно ли получить другие столбцы из этого запроса, которые не были сгруппированы? Если массив объектов, я хотел бы получить этот объект, сгруппированный по двум столбцам, но получить все свойства от объекта, а не только эти два столбца. – FrenkyB 11 May 2018 в 10:43

С C # 7 вы также можете использовать кортежи значений:

group x by (x.Column1, x.Column2)

или

.GroupBy(x => (x.Column1, x.Column2))
15
ответ дан Nathan Tregillus 21 August 2018 в 02:51
поделиться

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

Пример:

public class Key
{
    public string Prop1 { get; set; }

    public string Prop2 { get; set; }
}

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

var groupedCycles = cycles.GroupBy(x => new Key
{ 
  Prop1 = x.Column1, 
  Prop2 = x.Column2 
})

Если вы не укажете свойства ключа, а затем отработаете их, вы можете сделать это так. Это будет GroupBy правильно и даст вам ключевые свойства.

var groupedCycles = cycles.GroupBy(x => new 
{ 
  Prop1 = x.Column1, 
  Prop2= x.Column2 
})

foreach (var groupedCycle in groupedCycles)
{
    var key = new Key();
    key.Prop1 = groupedCycle.Key.Prop1;
    key.Prop2 = groupedCycle.Key.Prop2;
}
0
ответ дан Ogglas 21 August 2018 в 02:51
поделиться

Образец процедуры

.GroupBy(x => new { x.Column1, x.Column2 })
633
ответ дан Pranay Rana 21 August 2018 в 02:51
поделиться
  • 1
    Какой тип возвращаемого объекта? – mggSoft 1 February 2013 в 18:22
  • 2
    @MGG_Soft, который будет анонимным типом – Alex 1 March 2013 в 16:15
  • 3
    Вы получаете «Invalid anonymous type declarator», потому что синтаксис слегка выключен, он должен быть написан как: .GroupBy (x = & gt; new {Column1 = x.Column1, Column2 = x.Column2}) – Tom Maher 30 October 2014 в 14:45
  • 4
    @Tom это должно работать так, как есть. Когда вы пропустите присвоение имен анонимному типу, C # предполагает, что вы хотите использовать имя свойства / поля, доступного для окончательного доступа, из проекции. (Итак, ваш пример эквивалентен Mo0gles ') – Crisfole 28 January 2015 в 14:54
  • 5
    нашел мой ответ. Мне нужно определить новый объект (MyViewEntity), содержащий свойства Column1 и Column2, и тип возвращаемого значения: IEnumerable & lt; IGrouping & lt; MyViewEntity, MyEntity & gt; & gt; и Snip-код группировки: MyEntityList.GroupBy (myEntity = & gt; новый MyViewEntity {Column1 = myEntity.Column1, Column2 = myEntity.Column2}); – Amir Chatrbahr 17 March 2015 в 02:05
var Results= query.GroupBy(f => new { /* add members here */  });
6
ответ дан sepehr 21 August 2018 в 02:51
поделиться

Ok получил это как:

var query = (from t in Transactions
             group t by new {t.MaterialID, t.ProductID}
             into grp
                    select new
                    {
                        grp.Key.MaterialID,
                        grp.Key.ProductID,
                        Quantity = grp.Sum(t => t.Quantity)
                    }).ToList();
417
ответ дан splattne 21 August 2018 в 02:51
поделиться
  • 1
    +1 - Спасибо за исчерпывающий пример. Другие фрагменты ответа слишком короткие и без контекста. Также вы показываете агрегатную функцию (сумма в этом случае). Очень полезно. Я считаю, что использование совокупной функции (то есть MAX, MIN, SUM и т. Д.) Бок о бок с группировкой является общим сценарием. – barrypicker 24 January 2014 в 20:44
  • 2
    Здесь: stackoverflow.com/questions/14189537/… , это показано для таблицы данных, когда группировка основана на одном столбце, имя которого известно, но как это можно сделать, если на основе столбцов на котором должна выполняться группировка, должна генерироваться динамически? – b.g 22 December 2016 в 13:42
  • 3
    Это действительно полезно для понимания концепции группировки и применения агрегации над ней. – rajibdotnet 18 September 2017 в 22:48
  • 4
Другие вопросы по тегам:

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