小编Lea*_*res的帖子

使用 linq 和 lambda 对列表进行分组和展平

我有以下课程

public class SolicitacaoConhecimentoTransporte
{
    public long ID { get; set; }

    public string CodigoOriginal { get; set; }

    public DateTime Data { get; set; }

    public List<CaixaConhecimentoTransporte> Caixas { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我想知道是否有一种方法可以使用 Linq(使用 lambda 表达式语法)实现以下代码的相同行为,

List<SolicitacaoConhecimentoTransporte> auxList = new List<SolicitacaoConhecimentoTransporte>();

foreach (SolicitacaoConhecimentoTransporte s in listaSolicitacao)
{
    SolicitacaoConhecimentoTransporte existing =
                    auxList.FirstOrDefault(f => f.CodigoOriginal == s.CodigoOriginal &&
                                                f.Data == s.Data && 
                                                f.ID == s.ID);

    if (existing == null)
    {
        auxList.Add(s);
    }
    else
    {
        existing.Caixas.AddRange(s.Caixas);
    }
}

return auxList;
Run Code Online (Sandbox Code Playgroud)

换句话说,将所有具有相同属性的实体分组并将所有列表合并为一个。 …

.net c# linq lambda grouping

3
推荐指数
1
解决办法
1113
查看次数

为什么编译器无法在Regex.Matches的foreach中推断出正确的类型?

我试图通过遍历MatchCollectionRegex一个内表达foreach循环,使用var关键字编译器推断那家伙是给我一个错误,对象Value属性是未知的.

foreach (var chapter in ChapterExtractor.Matches(page.RawContent))
{
    chapter.Add(chapter.Value); // Does not compile!
}
Run Code Online (Sandbox Code Playgroud)

何时varMatch它取代它完美无缺.

foreach (Match chapter in ChapterExtractor.Matches(page.RawContent))
{
    chapter.Add(chapter.Value); // OK!
}
Run Code Online (Sandbox Code Playgroud)

MSDN(http://msdn.microsoft.com/pt-br/library/system.text.regularexpressions.matchcollection ( v=vs.110 ) .aspx)中提供的示例也在循环中使用Match该类foreach.

但是,编译器不应该推断出chapter类型Match而不是object?所以,似乎编译器隐式执行object转换为Match.真的吗?

c# type-inference compiler-errors

2
推荐指数
1
解决办法
214
查看次数

从分类数组转向二进制矩阵

我有一个数组,其中包含一些属于集合的值.我想在二进制矩阵中转换此数组,此矩阵的每一列将表示该集合的每个可能值,对于与输入数组匹配的列,行值为1,对于所有其他列,行值为0.我认为这个名字就像二元枢轴.

输入数组是表类型的列

输入数组的示例(前面的示例只是大写字母,导致误解):

'Apple'
'香蕉'
'樱桃'
'Dragonfruit''Apple
'
'樱桃'

所以,在这个例子中,输入可以假设4个不同的值:'Apple','Banana','Cherry'或'Dragonfruit',在我的真实场景中它可以超过4.

示例输出矩阵:

1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1
1 0 0 0
0 0 1 0

我已经实现了这种期望的行为,但我想知道是否有更好的方法来执行此操作.以矢量化方式(没有每个类别的for循环)或使用内置函数.

 function [ binMatrix, categs ] = pivotToBinaryMatrix( input )
      categorizedInput = categorical(input);

      categs = categories(categorizedInput);

      binMatrix = zeros(size(atributo, 1), size(categorias, 1));

      for i = 1: size(caters,1)
           binMatrix(:,i) = ismember(categorizedInput, categs(i));
      end
 end
Run Code Online (Sandbox Code Playgroud)

对于包含9个类别的约50,000个条目,它在0.075137秒内执行.

编辑:我改进了这些例子,因为之前的例子导致了误解.

arrays performance matlab for-loop vectorization

2
推荐指数
1
解决办法
131
查看次数