从两个通用列表 C# 中删除重复项
Remove duplicate from two generic list C#
我有问题。我需要写一个 csv 文件(whit append),但我不能写文件中重复的项目。所以:
我读取了 csv 文件中的所有项目,我将项目添加到我的列表中(然后我写入文件),我想在写入文件之前从列表中删除重复项...我尝试使用 "distinct" 但它不起作用。
我的class:
class MyList_Base
{
public string Cliente {get; set; }
public double TotaleProvvigione { get; set; }
public double TotalePunti { get; set; }
public string Descrizione { get; set; }
public double Pezzi { get; set; }
public double Provvigione { get; set; }
public bool DigitalPen { get; set; }
public bool ReferenzaPersonale { get; set; }
public DateTime Data { get; set; }
public string Mese { get; set; }
public string Gara { get; set; }
public double PuntiGara { get; set; }
public string Note { get; set; }
public MyList_Base(string cliente, double totaleProvvigione, double totalePunti, string descrizione, double pezzi, double provvigione, bool digitalPen, bool referenzaPersonale, DateTime data, string mese, string gara, double puntiGara, string note)
{
Cliente = cliente;
TotaleProvvigione = totaleProvvigione;
TotalePunti = totalePunti;
Descrizione = descrizione;
Pezzi = pezzi;
Provvigione = provvigione;
DigitalPen = digitalPen;
ReferenzaPersonale = referenzaPersonale;
Data = data;
Mese = mese;
Gara = gara;
PuntiGara = puntiGara;
Note = Note;
}
public override string ToString()
{
return Cliente + ";" + TotaleProvvigione + ";" + TotalePunti + ";" + Descrizione + ";" + Pezzi + ";" + Provvigione + ";" + DigitalPen + ";" + ReferenzaPersonale + ";" + Data + ";" + Mese + ";" + Gara + ";" + PuntiGara+";" + Note;
}
public static MyList_Base Parse(string csv)
{
string[] tmp = csv.Split(';');
return new MyList_Base(tmp[0], Convert.ToDouble(tmp[1]), Convert.ToDouble(tmp[2]), tmp[3], Convert.ToDouble(tmp[4]), Convert.ToDouble(tmp[5]), Convert.ToBoolean(tmp[6]), Convert.ToBoolean(tmp[7]), Convert.ToDateTime(tmp[8]), tmp[9], tmp[10], Convert.ToDouble(tmp[11]), tmp[11]);
}
}
这就是我需要做的:“//TODO:删除重复项”
public List<MyList_Base> LoadMyData(string nomeFile)
{
if (!File.Exists(nomeFile)) return null;
List<MyList_Base> tmp = new List<MyList_Base>();
StreamReader sr = new StreamReader(nomeFile);
while(!sr.EndOfStream)
{
tmp.Add(MyList_Base.Parse(sr.ReadLine()));
}
sr.Close();
return tmp;
}
public bool Save(string nomeFile)
{
var tmp = LoadMyData(nomeFile);
StreamWriter sw = new StreamWriter(nomeFile);
//TODO: REMOVE DUPLICATE
foreach (var x in this)
{
sw.WriteLine(x.ToString());
}
sw.Close();
return true;
}
有人可以帮助我吗?
PS:抱歉我的英语不好..
法比奥.
Enumerable.Distinct
扩展方法可能对您有所帮助。
如果您不能使用默认值(MyList_Base
的Equals
方法),则有一个 overload 和 IEqualityComparer
。这可能是这种情况,例如您的 Equals
方法只会比较部分字段,但您可能想要检查所有字段。
您可以使用列表的 Distinct 扩展方法并传递一个实现 IEqualityComparer 的对象。检查这个:
http://blog.alex-turok.com/2013/03/c-linq-and-iequalitycomparer.html
我有问题。我需要写一个 csv 文件(whit append),但我不能写文件中重复的项目。所以:
我读取了 csv 文件中的所有项目,我将项目添加到我的列表中(然后我写入文件),我想在写入文件之前从列表中删除重复项...我尝试使用 "distinct" 但它不起作用。
我的class:
class MyList_Base
{
public string Cliente {get; set; }
public double TotaleProvvigione { get; set; }
public double TotalePunti { get; set; }
public string Descrizione { get; set; }
public double Pezzi { get; set; }
public double Provvigione { get; set; }
public bool DigitalPen { get; set; }
public bool ReferenzaPersonale { get; set; }
public DateTime Data { get; set; }
public string Mese { get; set; }
public string Gara { get; set; }
public double PuntiGara { get; set; }
public string Note { get; set; }
public MyList_Base(string cliente, double totaleProvvigione, double totalePunti, string descrizione, double pezzi, double provvigione, bool digitalPen, bool referenzaPersonale, DateTime data, string mese, string gara, double puntiGara, string note)
{
Cliente = cliente;
TotaleProvvigione = totaleProvvigione;
TotalePunti = totalePunti;
Descrizione = descrizione;
Pezzi = pezzi;
Provvigione = provvigione;
DigitalPen = digitalPen;
ReferenzaPersonale = referenzaPersonale;
Data = data;
Mese = mese;
Gara = gara;
PuntiGara = puntiGara;
Note = Note;
}
public override string ToString()
{
return Cliente + ";" + TotaleProvvigione + ";" + TotalePunti + ";" + Descrizione + ";" + Pezzi + ";" + Provvigione + ";" + DigitalPen + ";" + ReferenzaPersonale + ";" + Data + ";" + Mese + ";" + Gara + ";" + PuntiGara+";" + Note;
}
public static MyList_Base Parse(string csv)
{
string[] tmp = csv.Split(';');
return new MyList_Base(tmp[0], Convert.ToDouble(tmp[1]), Convert.ToDouble(tmp[2]), tmp[3], Convert.ToDouble(tmp[4]), Convert.ToDouble(tmp[5]), Convert.ToBoolean(tmp[6]), Convert.ToBoolean(tmp[7]), Convert.ToDateTime(tmp[8]), tmp[9], tmp[10], Convert.ToDouble(tmp[11]), tmp[11]);
}
}
这就是我需要做的:“//TODO:删除重复项”
public List<MyList_Base> LoadMyData(string nomeFile)
{
if (!File.Exists(nomeFile)) return null;
List<MyList_Base> tmp = new List<MyList_Base>();
StreamReader sr = new StreamReader(nomeFile);
while(!sr.EndOfStream)
{
tmp.Add(MyList_Base.Parse(sr.ReadLine()));
}
sr.Close();
return tmp;
}
public bool Save(string nomeFile)
{
var tmp = LoadMyData(nomeFile);
StreamWriter sw = new StreamWriter(nomeFile);
//TODO: REMOVE DUPLICATE
foreach (var x in this)
{
sw.WriteLine(x.ToString());
}
sw.Close();
return true;
}
有人可以帮助我吗?
PS:抱歉我的英语不好.. 法比奥.
Enumerable.Distinct
扩展方法可能对您有所帮助。
如果您不能使用默认值(MyList_Base
的Equals
方法),则有一个 overload 和 IEqualityComparer
。这可能是这种情况,例如您的 Equals
方法只会比较部分字段,但您可能想要检查所有字段。
您可以使用列表的 Distinct 扩展方法并传递一个实现 IEqualityComparer 的对象。检查这个:
http://blog.alex-turok.com/2013/03/c-linq-and-iequalitycomparer.html