我如何 return 一个 class 的新实例作为字符串并将其用作泛型方法的参数?
How can I return a new instance of a class as a string and use it as a parameter of a generic method?
我有这个通用方法来解决 fizzbuzz 测验,但是当我使用 class 实例作为该方法的参数时。我得到一个空输出。谁能帮忙解决这个问题。
if input is divisible by 3 output Fizz
divisible by 5 output = Buzz
3 & 5 = FizzBuz<
private static string FizzBuzz<T>(T item)
{
int itemLength = item.ToString().Length;
string output = "";
if (itemLength % 3 == 0)
{
output += "Fizz";
}
if (itemLength % 5 == 0)
{
output += "Buzz";
}
return output;
}
这里有一个class
public class UserModel
{
public string FirstName { get; set; }
public string LastName { get; set; }
}
//在main方法中class
static void Main(string[] args)
{
string result = (FizzBuzz("tests"));
Console.WriteLine($"Tests: {result}");
result = FizzBuzz(223);
Console.WriteLine($"223:{result}");
result = FizzBuzz ( new UserModel { FirstName = "Vic", LastName = "Okpas"});
Console.WriteLine($" user model: {result}");
}
输出:
Tests: Buzz
223: Fizz
user model:
用户模型应该输出 Fizz,因为名字有 3 个字母。谁能帮我弄清楚我做错了什么。
关键是 ToString()
在 int itemLength = item.ToString().Length;
让我们稍微重构一下您的程序,看看发生了什么。
static string FizzBuzz<T>(T item)
{
int itemLength = item.ToString().Length;
string output = "";
if (itemLength % 3 == 0)
{
output += "Fizz";
}
if (itemLength % 5 == 0)
{
output += "Buzz";
}
Console.WriteLine($"'{item.ToString()}' -> {itemLength} -> '{output}'");
return output;
}
现在代码如下
FizzBuzz("tests");
FizzBuzz(223);
FizzBuzz(new UserModel
{
FirstName = "Vic",
LastName = "Okpas"
});
打印
'tests' -> 5 -> 'Buzz'
'223' -> 3 -> 'Fizz'
'UserModel' -> 9 -> 'Fizz'
问题是 class 的 ToString()
给出了它的名字。
有了这些知识,如果你坚持你的 FizzBuzz 应该使用 ToString().Length
作为数字,我们需要做的就是教 ItemModel
class 如何 return FirstName
来自 ToString()
:
public class UserModel
{
public string FirstName { get; set; }
public string LastName { get; set; }
public override string ToString()
{
return FirstName;
}
}
现在
的输出
FizzBuzz(new UserModel
{
FirstName = "Vic",
LastName = "Okpas"
});
是
'Vic' => 3 -> 'Fizz'
一些笔记
普通的 FizzBuzz?
FizzBuzz 方法不能真正通用,因为它们的输入实际上是一个数字,没有别的。对于给定类型,这个数字是多少无法在方法内部决定。
这个在我看来比较明智:
static string FizzBuzz(int x)
{
string output = "";
if (x% 3 == 0)
...
}
// and then
var userModel = new UserModel
{
FirstName = "Vic",
LastName = "Okpas"
}
FizzBuzz(userModel.FirstName.Length);
接口
如果你真的想让 FizzBuzz 更通用,你可以让它接受和接口。
static string FizzBuzz(IForFizzBuzz item)
{
int x = item.NumberForFizzBuzz;
string output = "";
if (x % 3 == 0)
{
output += "Fizz";
}
if (x % 5 == 0)
{
output += "Buzz";
}
Console.WriteLine($"'{x} -> '{output}'");
return output;
}
public class UserModel: IForFizzBuzz
{
public string FirstName { get; set; }
public string LastName { get; set; }
public int NumberForFizzBuzz => FirstName.Length;
}
public interface IForFizzBuzz {
public int NumberForFizzBuzz {get; }
}
然后你可以用你的模型调用它
FizzBuzz(new UserModel
{
FirstName = "Vic",
LastName = "Okpas"
});
泛型与对象
由于 C# 中的所有类型都提供 ToString()
您的方法版本无法从泛型中获益,只能接受 object
static string FizzBuzz(object item)
{
int itemLength = item.ToString().Length;
string output = "";
...
我有这个通用方法来解决 fizzbuzz 测验,但是当我使用 class 实例作为该方法的参数时。我得到一个空输出。谁能帮忙解决这个问题。
if input is divisible by 3 output Fizz
divisible by 5 output = Buzz
3 & 5 = FizzBuz<
private static string FizzBuzz<T>(T item)
{
int itemLength = item.ToString().Length;
string output = "";
if (itemLength % 3 == 0)
{
output += "Fizz";
}
if (itemLength % 5 == 0)
{
output += "Buzz";
}
return output;
}
这里有一个class
public class UserModel
{
public string FirstName { get; set; }
public string LastName { get; set; }
}
//在main方法中class
static void Main(string[] args)
{
string result = (FizzBuzz("tests"));
Console.WriteLine($"Tests: {result}");
result = FizzBuzz(223);
Console.WriteLine($"223:{result}");
result = FizzBuzz ( new UserModel { FirstName = "Vic", LastName = "Okpas"});
Console.WriteLine($" user model: {result}");
}
输出:
Tests: Buzz
223: Fizz
user model:
用户模型应该输出 Fizz,因为名字有 3 个字母。谁能帮我弄清楚我做错了什么。
关键是 ToString()
在 int itemLength = item.ToString().Length;
让我们稍微重构一下您的程序,看看发生了什么。
static string FizzBuzz<T>(T item)
{
int itemLength = item.ToString().Length;
string output = "";
if (itemLength % 3 == 0)
{
output += "Fizz";
}
if (itemLength % 5 == 0)
{
output += "Buzz";
}
Console.WriteLine($"'{item.ToString()}' -> {itemLength} -> '{output}'");
return output;
}
现在代码如下
FizzBuzz("tests");
FizzBuzz(223);
FizzBuzz(new UserModel
{
FirstName = "Vic",
LastName = "Okpas"
});
打印
'tests' -> 5 -> 'Buzz'
'223' -> 3 -> 'Fizz'
'UserModel' -> 9 -> 'Fizz'
问题是 class 的 ToString()
给出了它的名字。
有了这些知识,如果你坚持你的 FizzBuzz 应该使用 ToString().Length
作为数字,我们需要做的就是教 ItemModel
class 如何 return FirstName
来自 ToString()
:
public class UserModel
{
public string FirstName { get; set; }
public string LastName { get; set; }
public override string ToString()
{
return FirstName;
}
}
现在
的输出FizzBuzz(new UserModel
{
FirstName = "Vic",
LastName = "Okpas"
});
是
'Vic' => 3 -> 'Fizz'
一些笔记
普通的 FizzBuzz?
FizzBuzz 方法不能真正通用,因为它们的输入实际上是一个数字,没有别的。对于给定类型,这个数字是多少无法在方法内部决定。
这个在我看来比较明智:
static string FizzBuzz(int x)
{
string output = "";
if (x% 3 == 0)
...
}
// and then
var userModel = new UserModel
{
FirstName = "Vic",
LastName = "Okpas"
}
FizzBuzz(userModel.FirstName.Length);
接口
如果你真的想让 FizzBuzz 更通用,你可以让它接受和接口。
static string FizzBuzz(IForFizzBuzz item)
{
int x = item.NumberForFizzBuzz;
string output = "";
if (x % 3 == 0)
{
output += "Fizz";
}
if (x % 5 == 0)
{
output += "Buzz";
}
Console.WriteLine($"'{x} -> '{output}'");
return output;
}
public class UserModel: IForFizzBuzz
{
public string FirstName { get; set; }
public string LastName { get; set; }
public int NumberForFizzBuzz => FirstName.Length;
}
public interface IForFizzBuzz {
public int NumberForFizzBuzz {get; }
}
然后你可以用你的模型调用它
FizzBuzz(new UserModel
{
FirstName = "Vic",
LastName = "Okpas"
});
泛型与对象
由于 C# 中的所有类型都提供 ToString()
您的方法版本无法从泛型中获益,只能接受 object
static string FizzBuzz(object item)
{
int itemLength = item.ToString().Length;
string output = "";
...