首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在C#中使列表项向上匹配

在C#中使列表项向上匹配
EN

Stack Overflow用户
提问于 2016-11-09 05:02:58
回答 3查看 486关注 0票数 1

我需要一个更好的解决方案,下面的代码在linq或任何其他更好的方式,代码使所有的项目向上匹配的condition.If条件是process.Name = "process-5“,它应该返回所有项的条件匹配,包括匹配的项目,在这种情况下,将有5个项目在列表中。

代码语言:javascript
复制
using System;
using System.Collections.Generic;

namespace ListSelectSample
{
class Process
{
    public long Id { get; set; }

    public string Name { get; set; }
}
class Program
{
    static void Main(string[] args)
    {
        var processlist = new List<Process>();
        for(var count = 1; count <= 10; count++)
            processlist.Add(new Process() { Id = count, Name = "Process-" + count});

        var selectedprocesslist = new List<Process>();

        foreach (var process in processlist)
        {
            selectedprocesslist.Add(process);

            if (process.Name.ToLower().Equals("process-4"))
                break;
        }
        Console.ReadKey();
    }
}
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-11-09 05:20:25

TakeWhileSkipWhile应该能做到这一点。

代码语言:javascript
复制
var selectedProcessList = processList
                          .TakeWhile(x => !x.Name.ToLower().Equals("process-4"))
                          .ToList();

// Include selected item
if (selectedProcessList.Length < processList.Length)
    selectedProcessList.Add(processList
                            .SkipWhile(x => !x.Name.ToLower().Equals("process-4"))
                            .First());

编辑:使用上述方法的检查和警告的,混合解决方案可能更干净:

代码语言:javascript
复制
int idx = processList.Select(x => x.Name.ToLower()).ToList().IndexOf("process-4");
var selectedProcessList = idx < 0 ? processList : processList.Take(idx + 1).ToList();

不过,正如M.kazem所说,LINQ解决方案不会像您目前使用的迭代方法那样高效。如果您的列表足够小,则差异可以忽略不计,但请记住这一点。

票数 1
EN

Stack Overflow用户

发布于 2016-11-09 05:35:51

你可以FindIndex()采取()

在找到index name等于process-4之前,从processlist中获取列表

代码语言:javascript
复制
 int index = processlist.FindIndex(x => x.Name.ToLower().Equals("process-4"));
 var selectedProcessList = processlist.Take(index+1).ToList();
票数 1
EN

Stack Overflow用户

发布于 2016-11-09 06:09:23

试试这个。

它需要名称属性的固定模式。

代码语言:javascript
复制
var selectedprocesslist = processlist.Where(o => Convert.ToInt16(o.Name.Split('-')[1]) <= Convert.ToInt16(("process-4").Split('-')[1])).ToList(); 
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40500420

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档