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.
此解决方案不完整且容易出错。所以你必须升级它以满足你的需要。
尝试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 });
我将两个文本文件读入两个不同的列表。
第一个 .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
然后迭代第二个列表并在方法SomehowGetDogById
return dog from dictionary.
此解决方案不完整且容易出错。所以你必须升级它以满足你的需要。
尝试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 });