2016-11-09 101 views
1

我需要在linq或其他更好的方法下面的代碼更好的解決方案,代碼獲取所有項目匹配condition.If條件是process.Name =「process-5」它應該返回條件匹配的所有項目,包括匹配的項目,在這種情況下,列表中會有5個項目。獲取列表項在C#中匹配

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

回答

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的解決方案將不會像作爲您當前使用的迭代方法有效。如果您的清單足夠小,差異可以忽略不計,但請牢記這一點。

+0

謝謝,這忽略匹配的項目,應返回項目,其中過程-4也。 – Mc27

+0

@ Mc27請參閱編輯。 – Abion47

+0

@ Mc27這是很好的解決方案,但請記住這將迭代列表兩次。 (你自己的代碼更高效)....但是由於你正在處理'process'列表,而且它們通常很少,所以這不應該成爲問題。 –

1

可以FindIndex()Take()

之前找到indexname等於process-4然後採取清單從processlist

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

這適用於所有情況。 – Mc27

0

試試這一個。

它需要Name屬性的修復模式。

var selectedprocesslist = processlist.Where(o => Convert.ToInt16(o.Name.Split('-')[1]) <= Convert.ToInt16(("process-4").Split('-')[1])).ToList();