使用 C# 使用 lambda 表达式过滤和添加值

Posted

技术标签:

【中文标题】使用 C# 使用 lambda 表达式过滤和添加值【英文标题】:Filter and add values using C# using lambda expression 【发布时间】:2016-08-04 09:43:03 【问题描述】:

C# 新手,感谢任何帮助。问题是我需要针对数组过滤我的 api 调用的结果(使用“allowedA”和“allowedB”数组。)我不知道如何编辑 lambda 表达式以检查循环。

 var activities = await _restClientTaxonomy.GetTaxonomyFullAsync(TAXONOMY_CLASSIFICATIONID_FOR_ACTIVITY);
 var activityTypes = await _restClientTaxonomy.GetTaxonomyFullAsync(TAXONOMY_CLASSIFICATIONID_FOR_ACTIVITY_TYPES);

            var documentEventxx = activities.Select(type => type.Id);

            long [] allowedA = new long [] 7137, 40385637;
            long [] allowedB = new long [] 7137, 40385637;


            foreach (long value in documentEventxx)
            

                foreach (var item in allowed)
                

                    if (item == value) 
                        //These are the values I am looking for -> values that are part of the documentEventxx and allowedB.
                    
                
            

            var result = activityTypes.Select(type => new CategoryViewModel
            
                Id = type.Id,//This is where I want to add only items that are in the allowedA array
                Text = type.Name,
                Types = activities.Where(a => a.ParentId == type.Id).Select(t => new TaxonomyMemberTextItem
                
                    Id = t.Id, //This is where I want to add only items that are in the allowedB array
                    Text = t.Name
                ).ToList()
            ).ToArray();

我一直在阅读有关 lambda 表达式和 foreach 循环的内容,所以请不要随便发布一个链接。

提前致谢。

【问题讨论】:

您是否尝试过活动。Where(a => a.ParentId == type.Id && allowedB.Contains(a.Id))?您可能需要将 .Contains() 更改为 IndexOf(a.id) != -1,试试吧。 【参考方案1】:

在选择之前过滤值。

            activityTypes.Where(x=>allowedA.Contains(x.Id)).Select(type => new CategoryViewModel
            
                Id = type.Id,
                Text = type.Name,
                Types = activities.Where(a => a.ParentId == type.Id &&  allowedB.Contains(a.Id)).Select(t => new TaxonomyMemberTextItem
                
                    Id = t.Id, 
                    Text = t.Name
                ).ToList()
            )

【讨论】:

【参考方案2】:

过滤你使用.Where。你.Select 创建一个新类型列表。所以为了过滤,然后创建你想要的对象列表:

var result = activityTypes.Where(type=>isAllowed(type.Id)).Select(type => new CategoryViewModel

    Id = type.Id,//This is where I want to add only items that are in the allowedA array
    Text = type.Name,
    Types = activities.Where(a => a.ParentId == type.Id&&isAllowed(a.Id)).Select(t => new TaxonomyMemberTextItem
    
        Id = t.Id, //This is where I want to add only items that are in the allowedB array
        Text = t.Name
    ).ToList()
).ToArray();

【讨论】:

顺便说一句,在您选择 TaxonomyMemberTextItem 的地方,您使用一个名为 t 的 lambda 变量,但它应该代表源类型,就像在它之前的 Where 中一样,以便更具可读性,因此请尝试使用 @ 987654325@.

以上是关于使用 C# 使用 lambda 表达式过滤和添加值的主要内容,如果未能解决你的问题,请参考以下文章

C# 无法从 lambda 表达式中获取类属性值

使用 Lambda 的 Java 8 过滤器数组

使用动态唯一键值对linq / lambda表达式列表过滤数据

带有类的 C# Lambda 表达式

转载 C#匿名函数 委托和Lambda表达式

使用 Linq 表达式进行 C# 动态数据库过滤