在 List<T> 对象上使用“IndexOf”

时间:2021-07-11 14:38:38

标签: c# indexof

在我的 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'"

所以我在这一点上被困了几个小时,我所有的搜索都没有产生任何相关的东西。我哪里出错了?

2 个答案:

答案 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)

那是因为 IndexOf 搜索列表中的确切对象。为了让它工作,你必须将 ipData 传递给它。

为此,您应该使用 FindFindIndex

相关问题