2017-09-26 47 views
-1

我努力將下面的嵌套循環轉換爲更易讀的LINQ語句。將嵌套循環轉換爲LINQ的問題

IEnumerable<PropertyInfo> testClassPageObjects = FindPageObjects(); 
T newControl = default(T); 

Parallel.ForEach(testClassPageObjects, (pageObject,state) => 
{    
    Type pageObjectType = pageObject.PropertyType; 
    var pageObjectControls = pageObjectType.GetFields(); 

    foreach (var control in pageObjectControls.Where(control => control.FieldType == typeof(T))) 
    { 
     if (control.Name == fieldNameNoSpaces) 
     { 
      var findsByAttribute = (FindsByAttribute) control.GetCustomAttribute(typeof(FindsByAttribute)); 
      newControl = (T) control 
       .FieldType 
       .GetConstructor(new[] {typeof(IWebDriver), typeof(By)}) 
       .Invoke(new object[] {driver, findsByAttribute.Locator}); 

      state.Break(); 
     } 
    }    
}); 

之前的所有內容,包括if語句我希望在LINQ語句中如果可能的話。該聲明應返回第一場比賽。在這種情況下,使用Parallel.ForEach和foreach不必相關。

非常感謝,

+1

您可以開始在您的Where()條件中添加&& control.Name == fieldNameNoSpaces'。我不知道爲什麼你在一個地方有一半的條件,其餘的在另一個地方。 – itsme86

+0

你試過了什麼?這是*不是*外包網站 – barakcaf

回答

1

認爲它看起來像這樣。不確定這是否更加誠實。

T control = FindPageObjects 
      .SelectMany 
       (
        pageObject => 
        pageObject.PropertyType.GetFields() 
       ) 
      .OfType<T>() 
      .Where 
       (
        control => 
        control.FieldType == typeof(T) && 
        control.Name == fieldNameNoSpaces 
       ) 
      .Select 
       ( 
        selectedControl => 
        selectedControl.FieldType 
        .GetConstructor(new[] { typeof(IWebDriver), typeof(By)}) 
        .Invoke 
         (
          new object[] 
          { 
           driver, 
           ((FindsByAttribute)(selectedControl.GetCustomAttribute(typeof(FindsByAttribute)))).Locator 
          } 
         ) 
       ) 
      .OfType<T>() 
      .FirstOrDefault(); 

說明:

的SelectMany允許您在一個集合內遍歷集合(頁面對象中的控件)

OfType確保你只看着型控制T,並且無需以後再投射。

其中檢查FieldType和Name。

選擇使用反射來基於控件的FieldType實例化新的T.

OfType必要的構造函數調用的結果轉換爲T的第二次

FirstOrDefault意味着,LINQ將運行這爲它找到的第一個記錄,如果它不找到它只會返回null。這相當於原始代碼中的Break。順便說一下,如果你想要並行性,你可以簡單地添加AsParallel,儘管我不確定會有多大的改進。

+0

謝謝。雖然我並沒有像你的建議那樣在LINQ中完成整個行動,但它確實爲我提供了我所需要的。 – Konzy262

+0

我通常不會在一個聲明中寫出類似的內容,但我認爲這將是一個有趣的挑戰。可能不是生產代碼的正確方法。 –