C# 如何获取两个文本文件之间的连接

C# How to get connection between two text files

我将两个文本文件读入两个不同的列表。

第一个 .txt 包含 ID 和狗的名字,它看起来像这样:

第二个 .txt 再次包含狗的 ID 和类型:

问题是:如何将相同 ID 的名称和类型写入控制台?

代码:

class Program
{
    static void Main(string[] args)
    {
        StreamReader sr = new StreamReader("dognames.txt", Encoding.Default);
        List<Names> Dog_names = new List<Names>();
        string header = Olvas.ReadLine();
        while (!sr.EndOfStream)
        {
            Dog_names.Add(new Names(Olvas.ReadLine()));
        }
        sr.Close();

        StreamReader sr2 = new StreamReader("dogtypes.txt", Encoding.Default);
        List<Types> Dog_types = new List<Types>();
        string header = Olvas.ReadLine();
        while (!sr2.EndOfStream)
        {
            Dog_types.Add(new Types(Olvas.ReadLine()));
        }
        sr2.Close();
    }
}
class Names
{
    public int ID;
    public string Name;

    public Names(string DateLine)
    {
        string[] DateLineElements = DateLine.Split(';');
        this.ID = int.Parse(DateLineElements[0]);
        this.Name = DateLineElements[1];
    }
}
class Types
{
    public int ID;
    public string Dog_Type;

    public Types(string DateLine)
    {
        string[] DateLineElements = DateLine.Split(';');
        this.ID = int.Parse(DateLineElements[0]);
        this.Dog_Type = DateLineElements[1];
    }
}

}

您可能想要一个 linq 连接。我将使用查询语法,因为我发现它对于连接更具可读性:

var j = from n in Dog_names
join t in Dog_types on n.ID = t.ID
select new {
  n.Name,
  t.Dog_Type
};

foreach(var d in j)
  Console.WriteLine($"Dog {d.Name} is a {d.Dog_Type}");

如果您想查看方法语法,例如,有很多 LINQ Join 教程here

public static void Main()
{
    List<Names> names = new List<Names>();
    List<Types> types = new List<Types>();
    List<FinalItem> finalList = new List<FinalItem>();
    var listWithName = File.ReadAllLines("1.txt");
    foreach(var x in listWithName)
    {
        names.Add(new Names(x));
    }
    var listWithType = File.ReadAllLines("2.txt");      
    foreach(var x in listWithType)
    {
        types.Add(new Types(x));
    }
    
    finalList = names.Select(x=>new FinalItem{ID=x.ID,Name=x.Name, Dog_Type=types.FirstOrDefault(y=>y.ID==x.ID)});
    
}

class FinalItem
{
    public int ID;
    public string Name;
    public string Dog_Type;
}

好的,首先你把非常简单的任务复杂化了。 有多种解决方案。

这是一种可能性。

为此创建一个模型,例如:

class Dog
{
    public int Id {get; set;}
    public string Name {get; set;}
    public string DogType {get; set;} //it could be and even should be an enum
}

接下来,只解析每一行,例如:

class DogParser
{
  public Dog CreateDog(string line)
  {
      Dog dog = new Dog();
      string[] fields = line.Split(';');
      dog.Id = Convert.ToInt32(fields[0]);
      dog.Name = fields[1];

      return dog;
  }

  public void UpdateDog(string line)
  {
    string[] fields = line.Split(';');
    int dogId = Convert.ToInt32(fields[0]);
    Dog dog = SomehowGetDogById(dogId);
    dog.DogType = fields[0];
  }
}

现在,只需将这些文件读入不同的 List 对象即可。并迭代它们。首先,使用名称迭代狗并使用 DogParser 中的 CreateDog 方法。将每只狗保存在某个列表中,或者更好的 Dictionary 中,其中键应该是狗的 ID。

然后迭代第二个列表并在方法SomehowGetDogById return dog from dictionary.

此解决方案不完整且容易出错。所以你必须升级它以满足你的需要。

如我所说,这只是分步示例。有很多解决方案。另一种是使用一些 csv 解析器,例如你可以阅读 this and this

尝试Join LINQ 方法:

// Sample definitions
class Types { public int ID; public string Type; }
class Names { public int ID; public string Name; }
// Implementation
var types = new List<Types>();
var names = new List<Names>();
var joinedResults = names.Join(types, n => n.ID, t => t.ID, (name, type) => new { name.Name, type.Type });