比较2个列表,将选择器指定为参数

时间:2016-06-22 09:52:55

标签: c# lambda delegates

我有以下功能

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

然后检查它是否有效

//Arrange
List<Alias> aliases = new List<Alias>();
Alias a1 = new Alias { alias = "test@test.com" };
Alias a2 = new Alias { alias = "test2@test.com" };
Alias a3 = new Alias { alias = "test3@test.com" };

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

List<string> chosenAliases = new List<string>
            {
                "test@test.com",
                "test@something.com",
            };

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

//Assert
Assert.IsTrue(hasCommonality);

我收到以下错误

Method.Func,System.Func方法的类型参数&#39;无法从使用中推断出来。尝试显式指定类型参数。

2 个答案:

答案 0 :(得分:1)

ListsHaveCommonality假设两个列表都具有相同的类型参数T。如果要将其与具有不同项类型的列表一起使用,则需要创建一个支持两个类型参数的方法,如下所示:

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

答案 1 :(得分:0)

listOne和listTwo都定义为List<T>,但是对于您发送List<Alias>的第一个,您要发送List<string>的第二个。