写一个C#代码来提取一个.csv文件,如果我给出第一列的一个元素,我就会得到另外两列的对应值

写一个C#代码来提取一个.csv文件,如果我给出第一列的一个元素,我就会得到另外两列的对应值,c#,C#,这是我的.csv文件: Apple,rose,tiger Mango,lily,cheetah Banana,sunflower,lion Apple,marigold,cat 输入:Mango(我把它写在文本框中) 期望输出: Flower = lily; Animal = cheetah Flower = rose,marigold; Animal = tiger,cat 同样地 输入:Apple 期望输出: Flower = lily; Animal = cheetah

这是我的.csv文件:

Apple,rose,tiger
Mango,lily,cheetah
Banana,sunflower,lion
Apple,marigold,cat
输入:
Mango
(我把它写在文本框中)
期望输出:

 Flower = lily;  Animal = cheetah
Flower = rose,marigold;  Animal = tiger,cat
同样地

输入:
Apple

期望输出:

 Flower = lily;  Animal = cheetah
Flower = rose,marigold;  Animal = tiger,cat
这是我写的代码:

private void button1_Click(object sender, EventArgs e)
    {
        using (var reader = new StreamReader(@"C:\asp_net\abc.csv"))
        {
            List<string> listA = new List<string>();
            List<string> listB = new List<string>();
            List<string> listC = new List<string>();
            while (!reader.EndOfStream)
            {
                var line = reader.ReadLine();
                var values = line.Split(',');
                listA.Add(values[0]);
                listB.Add(values[1]);
                listC.Add(values[2]);
            }

            string checkThis = obj.SearchSenSig(textBox1.Text);

            if (listA.Any(checkThis.Contains))
            {

                int count = listA.Where(x => x.Equals(checkThis)).Count();

                if (count == 1)
                {
                    int index = listA.IndexOf(checkThis);
                    var firstItem = listB.ElementAt(index);
                    var secondItem = listC.ElementAt(index);
                    MessageBox.Show(String.Format("receiver = {0}, url = {1}", firstItem, secondItem));
                }

                else
                {
                    foreach (string item in listA)
                    {
                        int i = listA.IndexOf(item);

                        bool result = item.Equals(checkThis);
                        if (result)
                        {

                            List<string> myCollection1 = new List<string>();
                            myCollection1.Add(listB.ElementAt(i));

                            string firstItem = string.Join(",", myCollection1);
                            List<string> myCollection2 = new List<string>();
                            myCollection2.Add(listC.ElementAt(i));

                            string secondItem = string.Join(",", myCollection2);
                            MessageBox.Show(String.Format("Flower = {0}, Animal = {1}", firstItem, secondItem));
                        }
                    }
                }
            }

            else
            {
                MessageBox.Show("The search element does not exists.");
            }
        }
private void按钮1\u单击(对象发送者,事件参数e)
{
使用(var reader=newstreamreader(@“C:\asp\u net\abc.csv”))
{
List listA=新列表();
List listB=新列表();
List listC=新列表();
而(!reader.EndOfStream)
{
var line=reader.ReadLine();
var值=行分割(',');
listA.Add(值[0]);
列表B.添加(值[1]);
添加(值[2]);
}
字符串检查this=obj.SearchSenSig(textBox1.Text);
if(listA.Any(checkThis.Contains))
{
int count=listA.Where(x=>x.Equals(checkThis)).count();
如果(计数=1)
{
int index=listA.IndexOf(选中此项);
var firstItem=listB.ElementAt(索引);
var secondItem=listC.ElementAt(索引);
Show(String.Format(“receiver={0},url={1}”,firstItem,secondItem));
}
其他的
{
foreach(列表A中的字符串项)
{
int i=列表a.IndexOf(项目);
bool result=item.Equals(选中此项);
如果(结果)
{
List myCollection1=新列表();
myCollection1.Add(列表B.ElementAt(i));
string firstItem=string.Join(“,”,myCollection1);
List myCollection2=新列表();
myCollection2.Add(listC.ElementAt(i));
string secondItem=string.Join(“,”,myCollection2);
Show(String.Format(“Flower={0},Animal={1}”,firstItem,secondItem));
}
}
}
}
其他的
{
Show(“搜索元素不存在”);
}
}

我仍然没有得到所需的输出。请帮助。

不要为每列创建不同的列表,而是创建一个类来保存整行数据:

class Data // I'll bet you can find a better name for this class...
{
    public string Fruit {get;set;}
    public string Flower {get;set;}
    public string Animal {get;set;}
}
并填充此类的列表:

private List<Data> data = new List<Data>(); // note: this is a field, not a local variable.
现在,在
按钮\u click
事件处理程序中需要做的就是获取与搜索字符串对应的所有项目。假设您仅使用该方法搜索水果并显示结果:

var result = data.FindAll(d => d.Fruit == searchString);
这将返回一个
数据列表
,其中
水果
属性包含与
搜索字符串
相同的字符串。使用linq和string。Join将结果格式化为字符串:

var resultString = $"Flower = {string.Join(",", result.Select(r => r.Flower))}; Animal = {string.Join(",", result.Select(r => r.Animal))}";

你到底得到了什么?你知道如何调试你的代码(设置断点并逐步遍历你的文件)?private void Form1_Load(object sender,EventArgs e){obj=new WebService1SoapClient();//错误:'}预期的'私有列表数据=new List();}}}//在我的代码末尾,我得到了一个错误“类型或名称空间定义,或预期的文件结尾”,很难理解您在注释中发布的代码,尤其是添加了注释的代码。请将代码粘贴到第三方网站,如rextester或.net fiddle,并在其中添加链接进行评论。