概括一个函数

时间:2016-12-22 15:57:46

标签: c#

我试图弄清楚是否有一种方法来推广一个函数,该函数接受具有相似属性的两个不相关对象的Hashset。我在下面有一些示例代码:

private IList<IDictionary<string, string>> BuildDictionary(HashSet<ClassA> ClassA)
{
    IList<IDictionary<string, string>> data = new List<IDictionary<string, string>>();
    foreach (var a in ClassA)
    {
        Dictionary<string, string> aDictionary = new Dictionary<string, string>();
        aDictionary.Add(a.Code, a.Code + "," + a.Name);
        data.Add(aDictionary);
    }

    return data;
}

private IList<IDictionary<string, string>> BuildDictionary(HashSet<ClassB> ClassB)
{
    IList<IDictionary<string, string>> data = new List<IDictionary<string, string>>();
    foreach (var b in ClassB)
    {
        Dictionary<string, string> bDictionary = new Dictionary<string, string>();
        bDictionary.Add(b.Code, b.Code + "," + b.Name);
        data.Add(bDictionary);
    }

    return data;
}

因此从代码中可以看出,这两个类没有关系,但它们都在HashSet中并包含类似的属性(代码,名称)。我已经尝试使用泛型T但由于我没有创建泛型类T而失败了。无论如何都可以在不创建新课程的情况下解决这个问题吗?

2 个答案:

答案 0 :(得分:3)

如果您拥有两种类型的源代码,则可以实现通用接口。

private IList<IDictionary<string, string>> BuildDictionary<T>(HashSet<T> someHashSetOfTs) where T : ICommon
{
    IList<IDictionary<string, string>> data = new List<IDictionary<string, string>>();
    foreach (var a in someHashSetOfTs)
    {
        Dictionary<string, string> aDictionary = new Dictionary<string, string>();
        aDictionary.Add(a.Code, a.Code + "," + a.Name);
        data.Add(aDictionary);
    }

    return data;
}

接口定义

public interface ICommon {
   string Code {get; }
   string Name {get; }
}

现在将ICommon应用于ClassAClassB两种类型。

答案 1 :(得分:3)

如果您的源类已被密封或无法修改为公共接口,则可以使用所需部件的访问器,就像在大多数LINQ查询中一样。

这是一个示例实现。请注意,可以更恰当地命名3 Final Boys 14 Yrs 100m Backstroke 01:00.83 269 3 Heat Boys 14 Yrs 100m Backstroke 01:01.18 104 3 Semi-F Boys 14 Yrs 100m Backstroke 01:00.66 156 1 Final Boys 14 Yrs 100m Freestyle 00:52.61 363 1 Heat Boys 14 Yrs 100m Freestyle 00:53.06 207 1 Semi-F Boys 14 Yrs 100m Freestyle 00:53.56 259 1 Final Boys 14 Yrs 200m Freestyle 01:53.34 555 1 Heat Boys 14 Yrs 200m Freestyle 01:57.29 402 1 Semi-F Boys 14 Yrs 200m Freestyle 01:55.23 454 1 Final Boys 14 Yrs 400m Freestyle 04:03.46 351 1 Heat Boys 11/14 Yrs 400m Freestyle 04:09.46 301 toKey(),但这足以复制您正在为可以指定lambda以检索相关属性的任何类所执行的操作,并且不是依赖于类必须具有相同的属性名称,只要相应地写入lambda。 toMemberValue()显示了在两种情况下使用此方法的效果。

Main()
相关问题