从两个通用列表C#中删除重复

时间:2015-05-10 08:34:17

标签: c# list csv generics duplicates

我遇到了问题。我需要编写一个csv文件(whit append),但我不能写出文件中重复的项目。所以:

我读了csv文件中的所有项目,我将项目添加到我的列表中(然后我写入文件),我想在写入文件之前从列表中删除重复...我尝试使用"不同"但它没有用。

我的课程:

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:抱歉我的英文不好.. 法比奥。

2 个答案:

答案 0 :(得分:2)

Enumerable.Distinct扩展方法可以为您提供帮助。

如果您无法使用默认(IEqualityComparer Equals方法),则会有overload MyList_Base。如果例如这可能是这种情况。您的Equals方法只会比较某些字段,但您需要检查所有字段。

答案 1 :(得分:0)

您可以使用列表的Distinct扩展方法并传递实现IEqualityComparer的对象。检查一下:

http://blog.alex-turok.com/2013/03/c-linq-and-iequalitycomparer.html