在我的 Visual Studio2019 C# 控制台程序(名为“codeTester”)中,我有这个对象:
public class ipData
{
private string ip;
private string region;
private string country;
public ipData(string ip, string region, string country)
{
this.ip = ip;
this.region = region;
this.country = country;
}
public string Ip
{
get { return ip; }
set { ip = value; }
}
public string Region
{
get { return region; }
set { region = value; }
}
public string Country
{
get { return country; }
set { country = value; }
}
}
我创建了这个对象的列表并添加了一些数据:
List<ipData> ipInfo = new List<ipData>();
ipInfo.Add(new ipData("192.168.0.199", "UT", "USA"));
ipInfo.Add(new ipData("251.168.0.963", "NB", "CAN"));
现在我想搜索列表中的一个字段,所以我要求用户提供要搜索的数据:
Console.WriteLine("Enter searh criteria: ");
string searchparam = Console.ReadLine();
接下来我想要找到的项目的索引,如果有的话:
int x = ipInfo.IndexOf(searchparam);
但是这个语句抛出了一个设计时异常,它说:
"参数 1:无法从 'string' 转换为 'codeTester.Program.ipData'"
所以我在这一点上被困了几个小时,我所有的搜索都没有产生任何相关的东西。我哪里出错了?
答案 0 :(得分:1)
它不起作用,因为搜索参数应该与列表的元素类型具有相同的类型。在本例中为 ipData
。
您可以使用接受 FindIndex 作为参数的 lambda expression:
int x =
ipInfo.FindIndex(ip => ip.Region == searchparam || ip.Country == searchparam);
if (x >= 0) {
Console.WriteLine($"The IP address is {ipInfo[x]}");
} else {
Console.WriteLine("not found");
}
或者你可以像这样使用 LINQ:
string ipAddress = ipInfo
.FirstOrDefault(ip => ip.Region == searchparam || ip.Country == searchparam)?.Ip;
如果没有找到条目,这将返回一个 null
字符串。
你也可以让它返回整个记录:
ipData data = ipInfo
.FirstOrDefault(ip => ip.Region == searchparam || ip.Country == searchparam);
if (data != null) {
Console.WriteLine(
$"Country = {data.Country}, Region = {data.Region}, IP = {data.ip}");
}
LINQ 还允许您返回多个结果。例如。你可以像这样返回一个国家对应的所有数据:
var result = ipInfo.Where(ip => ip.Country == "USA");
foreach (ipData data in result) {
Console.WriteLine(
$"Country = {data.Country}, Region = {data.Region}, IP = {data.ip}");
}
C# 命名约定规定类名应使用 PascalCase 编写。另一种约定是,长度最多为两个字符的首字母缩略词全部大写 (IP
)。根据这些约定,类名应该是 IPData
。
另见:
答案 1 :(得分:0)