2016-06-22 20 views
0

Parameter Ich habe die folgende FunktionVergleichen 2 Listen, die Selektoren Angabe als

public static class ListUtils 
{ 
    public static bool ListsHaveCommonality<T>(List<T> listOne, List<T> listTwo, Func<T, string> selectorOne, Func<T, string> selectorTwo) 
    { 
    return listOne.Select(selectorOne).Intersect(listTwo.Select(selectorTwo)).Any(); 
    } 
} 

Dann wird ein Test zu überprüfen, es

//Arrange 
List<Alias> aliases = new List<Alias>(); 
Alias a1 = new Alias { alias = "[email protected]" }; 
Alias a2 = new Alias { alias = "[email protected]" }; 
Alias a3 = new Alias { alias = "[email protected]" }; 

aliases.Add(a1); 
aliases.Add(a2); 
aliases.Add(a3); 

List<string> chosenAliases = new List<string> 
      { 
       "[email protected]", 
       "[email protected]", 
      }; 

//Act 
bool hasCommonality = ListUtils.ListsHaveCommonality(aliases, chosenAliases, (Alias a) => a.alias, (string s) => s); 

//Assert 
Assert.IsTrue(hasCommonality); 

arbeitet I

Die Art Argumente der folgenden Fehler angezeigt für Methode System.Func, System.Func) kann nicht aus der Verwendung abgeleitet werden. Versuchen Sie, die Typargumente explizit anzugeben.

+0

'ListsHaveCommonality' geht davon aus, dass beide Listen den gleichen Typparameter' T' haben. –

+0

Oh ja. Das hat mir geholfen, es zu korrigieren 'öffentliche statische bool ListsHaveCommonality (Liste listOne, Liste listTwo, Func selectorOne, Func selectorTwo)' – user2436996

Antwort

1

ListsHaveCommonality wird davon ausgegangen, dass beide Listen den gleichen Typparameter T haben. Wenn Sie es mit Listen verwenden möchten, die verschiedene Elementtypen haben, müssen Sie ein Verfahren schaffen, die zwei Typparametern wie folgt unterstützt:

public static class ListUtils 
{ 
    public static bool ListsHaveCommonality<T1,T2>(
     List<T1> listOne, 
     List<T2> listTwo, 
     Func<T1, string> selectorOne, 
     Func<T2, string> selectorTwo) 
    { 
     return listOne.Select(selectorOne).Intersect(listTwo.Select(selectorTwo)).Any(); 
    } 
} 
0

listOne und listTwo sind beide als List<T> definiert, aber für die erste Sie sind Senden Sie List<Alias> und für die Sekunde senden Sie List<string>.

Verwandte Themen