获取C#中匹配的列表项

时间:2016-11-09 05:02:58

标签: c# linq

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

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();
    }
}
}

3 个答案:

答案 0 :(得分:1)

TakeWhileSkipWhile可以解决问题。

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());

编辑:通过上述方法的检查和警告,混合解决方案可能更清晰:

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 :(得分:1)

您可以FindIndex()Take()

在找到index name等于process-4之前,请从processlist

中获取列表
 int index = processlist.FindIndex(x => x.Name.ToLower().Equals("process-4"));
 var selectedProcessList = processlist.Take(index+1).ToList();

答案 2 :(得分:0)

试试这个。

它需要一个Name属性的修复模式。

view