gpt4 book ai didi

c# - 是否可以将通用方法应用于项目列表?

转载 作者:可可西里 更新时间:2023-11-01 07:44:43 25 4
gpt4 key购买 nike

假设我已经编写了自己的方法来反转列表。

public static void MyReverse<T>(List<T> source)
{
var length = source.Count;
var hLength = length / 2;
for (var i = 0; i < hLength; i++)
{
T temp = source[i];
source[i] = source[length - 1 - i];
source[length - 1 - i] = temp;
}
}

我这样调用它,而且它有效。

var fooList = new List<Foo>();
MyReverse(fooList);

如果我想反转多个列表,我会这样调用。

var fooList = new List<Foo>();
var barList = new List<Bar>();
var bazList = new List<Baz>();
MyReverse(fooList);
MyReverse(barList);
MyReverse(bazList);

如果我想反转任意数量的列表,我会尝试:

public static void Main(string[] args)
{
var lists = new List<object>
{
new List<Foo>(),
new List<Bar>(),
new List<Bar>()
};

ReverseLists(lists);
}

public static void ReverseLists(List<object> sourceLists)
{
foreach (var sourceList in sourceLists)
{
MyReverse(sourceList); // Error: Type arguments cannot be inferred from usage
}
}

但这会引发编译时错误。我尝试做的事情是否可行 - ReverseLists 方法是否可以实现?

最佳答案

假设你有这样一个静态方法

public static class ReverseHelper
{
public static void MyReverse<T>(IList<T> source)
{
var length = source.Count;
var hLength = length / 2;
for (var i = 0; i < hLength; i++)
{
T temp = source[i];
source[i] = source[length - 1 - i];
source[length - 1 - i] = temp;
}
}
}

在非通用接口(interface)和通用类的帮助下,您可以做到这一点。

public interface IReverser
{
void Reverse();
}
public class ListReverser<T> : IReverser
{
private readonly IList<T> source;
public ListReverser(IList<T> source)
{
this.source = source;
}
public void Reverse()
{
ReverseHelper.MyReverse<T>(source);
}
}
static void Main(string[] args)
{
var lists = new List<IReverser>
{
new ListReverser<Foo>(new List<Foo>()),
new ListReverser<Bar>(new List<Bar>()),
new ListReverser<Bar>(new List<Bar>())
};

foreach (var reverser in lists)
{
reverser.Reverse();
}
}

我用过 IList<T>而不是 List<T>支持更多类型;如果你想要List<T>你可以把它放回去。

关于c# - 是否可以将通用方法应用于项目列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28170400/

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