gpt4 book ai didi

c# - 如何重构这些泛型方法?

转载 作者:太空狗 更新时间:2023-10-29 22:07:42 25 4
gpt4 key购买 nike

更新:我应该在原帖中提到我想在这里了解更多关于泛型的知识。我知道这可以通过修改基类或创建两个文档类都实现的接口(interface)来完成。但是为了这个练习,我只对不需要对文档类或其基类进行任何修改的解决方案感兴趣。我认为问题涉及扩展方法这一事实暗示了这一点。

我已经编写了两个几乎相同的通用扩展方法,并且正在尝试弄清楚如何将它们重构为一个方法。它们的区别仅在于一个对 List 进行操作,另一个对 List 进行操作,我感兴趣的属性是 AssetDocument 的 AssetID 和 PersonDocument 的 PersonID。尽管 AssetDocument 和 PersonDocument 具有相同的基类,但每个类中都定义了属性,所以我认为这没有帮助。我试过了

public static string ToCSVList<T>(this T list) where T : List<PersonDocument>, List<AssetDocument>

我想我也许可以测试类型并采取相应的行动,但这会导致语法错误

Type parameter 'T' inherits conflicting constraints

这些是我想重构为一个方法的方法,但也许我只是太过分了,最好让它们保持原样。我想听听你的想法。

public static string ToCSVList<T>(this T list) where T : List<AssetDocument>
{
var sb = new StringBuilder(list.Count * 36 + list.Count);
string delimiter = String.Empty;

foreach (var document in list)
{
sb.Append(delimiter + document.AssetID.ToString());
delimiter = ",";
}

return sb.ToString();
}

public static string ToCSVList<T>(this T list) where T : List<PersonDocument>
{
var sb = new StringBuilder(list.Count * 36 + list.Count);
string delimiter = String.Empty;

foreach (var document in list)
{
sb.Append(delimiter + document.PersonID.ToString());
delimiter = ",";
}

return sb.ToString();
}

最佳答案

您的实现基本上是重新实现 string.Join 方法,因此您可以尝试使用一些 LINQ 使其更简单和更通用:

public static string ToCSVList<T>(this IEnumerable<T> collection)
{ return string.Join(",", collection.Select(x => x.ToString()).ToArray()); }

public static string ToCSVList(this IEnumerable<AssetDocument> assets)
{ return assets.Select(a => a.AssetID).ToCSVList(); }

public static string ToCSVList(this IEnumerable<PersonDocument> persons)
{ return persons.Select(p => p.PersonID).ToCSVList(); }

关于c# - 如何重构这些泛型方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2431987/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com