C# 如何在接收到包含重复项的数组后读取和写入文件
我收到一个产品列表(列表)及其数量列表(listI),我想从数据库中删除一些项目,具体取决于我在listI上收到的数量。它就像一个魔咒,只要我不在列表上收到重复的产品,这就是我试图解决的问题C# 如何在接收到包含重复项的数组后读取和写入文件,c#,io,C#,Io,我收到一个产品列表(列表)及其数量列表(listI),我想从数据库中删除一些项目,具体取决于我在listI上收到的数量。它就像一个魔咒,只要我不在列表上收到重复的产品,这就是我试图解决的问题 public void remove(string[] listS, int[] listI) { int check = 0; int quantidadeDB; string ingredientDB; string ing
public void remove(string[] listS, int[] listI)
{
int check = 0;
int quantidadeDB;
string ingredientDB;
string ingredient;
int quantity;
string newLine;
string[] linesSplit;
string[] lines = System.IO.File.ReadAllLines("c:\\z.txt");
System.IO.StreamWriter fileTemp = new System.IO.StreamWriter("c:\\z2.txt");
for(int i = 0; i < lines.Length;i++)
{
linesSplit = lines[i].Split(' ');
ingredientDB = linesSplit[0];
quantityeDB = int.Parse(linesSplit[1]);
check = 0;
for(int j=0;j<listS.Length;j++)
{
ingredient = listS[j];
quantity = listI[j];
if (ingredientDB.ToLower().Equals(ingredient.ToLower()))
{
newLine = ingredientDB + " " + (quantityDB - quantity);
fileTemp.WriteLine(newLine);
check++;
}
}
if(check.Equals(0))
fileB.WriteLine(ingredientDB + " " + quantityDB);
}
fileTemp.Close();
string text = System.IO.File.ReadAllText("c:\\z2.txt");
System.IO.StreamWriter fileL = new System.IO.StreamWriter("c:\\z.txt");
fileL.Write(text);
fileL.Close();
}
这是它应该如何输出的:
Fanta 100
Pepsi -6
Coca-Cola 3
IcedTea
Ketchup 20
而不是:
Fanta 100
Pepsi 0
Pepsi -1
Pepsi -1
Coca-Cola 3
IcedTea 23
Ketchup 22
Ketchup 21
换行
newLine = ingredientDB + " " + (quantityDB - quantity);
为此:
newLine = ingredientDB + " " + (Int32.Parse(quantityDB) - Int32.Parse(quantity)).ToString();
不能将
字符串
隐式转换为int
。因此产生了一些不寻常的结果。如果您有一个包含名称和数量的产品结构,那么实现起来会更好
struct Product
{
public string Name;
public int Quantity;
}
有一种方法可以通过嵌套for循环修复您的问题,并将数组转换为列表
List<Product> products = new List<Product>();
for(int i = 0; i < listS.Length; i++)
{
bool duplicate = false;
foreach(Product p in products)
{
if(listS[i].ToLower().Equals(p.Name.ToLower()))
{
p.Quantity += listI[i];
duplicate = true;
break;
}
}
if(!duplicate)
{
Product p;
p.Name = listS[i];
p.Quantity = listI[i];
products.Add(a)
}
}
List products=newlist();
for(int i=0;i
这样,产品将不会有重复
编辑:如果您真的想继续使用代码,因为您认为将所有内容转换为结构将导致性能损失,那么使用代码实现的修复实际上效率很低
整个方法可以这样实现
public void remove(string[] listS, int[] listI)
{
List<Product> products = new List<Product>();
for(int i = 0; i < listS.Length; i++)
{
bool duplicate = false;
foreach(Product p in products)
{
if(listS[i].ToLower().Equals(p.Name.ToLower()))
{
p.Quantity += listI[i];
duplicate = true;
break;
}
}
if(!duplicate)
{
Product p;
p.Name = listS[i];
p.Quantity = listI[i];
products.Add(a)
}
}
string[] lines = System.IO.File.ReadAllLines("c:\\z.txt");
for(int i = 0; i < lines.Length; i++)
{
string[] linesSplit = lines[i].Split(' ');
foreach(Product p in products)
{
if (linesSplit[0].ToLower().Equals(p.Name.ToLower()))
{
lines[i] = linesSplit[0] + " " + (int.Parse(linesSplit[1]) - p.Quantity);
products.Remove(p)
break;
}
}
}
System.IO.StreamWriter file = new System.IO.StreamWriter("c:\\z.txt");
file.Write(lines);
file.Close();
}
public void remove(字符串[]列表,int[]列表i)
{
列表产品=新列表();
for(int i=0;i
他已经在这行quantityeDB=int.Parse(linesSplit[1])上进行了解析;而且数量始终是一个问题,为什么在输出中显示Pepsi-6
?您是仅显示扣除的数量
,还是指扣除后剩余的数量?我指的是扣除后重命名的数量。我忘了说,但listI[1]列出了[1]数量等等。你只有2台百事可乐
分贝。扣除后应为百事-4
。但您正在将百事-6
显示为输出。这是什么意思?@Shaharyar我想你需要温习一下你的数学2-2-3-3=-6@Shaharyar我有两个百事可乐,在删除8Pepsi(2Pepsi+3Pepsi+3Pepsi)后,应该是-6 Pepsi。感谢您的帮助,是的,这会更容易,但我无法更改我的方法签名,因为我在web服务上使用它,它必须接收两个阵列:/
public void remove(string[] listS, int[] listI)
{
List<Product> products = new List<Product>();
for(int i = 0; i < listS.Length; i++)
{
bool duplicate = false;
foreach(Product p in products)
{
if(listS[i].ToLower().Equals(p.Name.ToLower()))
{
p.Quantity += listI[i];
duplicate = true;
break;
}
}
if(!duplicate)
{
Product p;
p.Name = listS[i];
p.Quantity = listI[i];
products.Add(a)
}
}
string[] lines = System.IO.File.ReadAllLines("c:\\z.txt");
for(int i = 0; i < lines.Length; i++)
{
string[] linesSplit = lines[i].Split(' ');
foreach(Product p in products)
{
if (linesSplit[0].ToLower().Equals(p.Name.ToLower()))
{
lines[i] = linesSplit[0] + " " + (int.Parse(linesSplit[1]) - p.Quantity);
products.Remove(p)
break;
}
}
}
System.IO.StreamWriter file = new System.IO.StreamWriter("c:\\z.txt");
file.Write(lines);
file.Close();
}