【问题标题】:Remove duplicate from two generic list C# [duplicate]从两个通用列表 C# 中删除重复项 [重复]
【发布时间】:2015-07-20 21:00:06
【问题描述】:

我有一个问题。我需要编写一个 csv 文件(带有附加),但我无法编写文件中重复的项目。所以:

我读取了 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: REMOVE DUPLICATE”

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:对不起我的英语不好.. 法比奥。

【问题讨论】:

  • MyList_Base 的 t 键是什么?
  • 你认为什么是重复的?所有值都必须相同还是只是关键属性?
  • 我认为列表中的一项重复,而另一项的值完全相同。我没有主键,我不需要在列表中有两个相同的项目

标签: c# list csv generics duplicates


【解决方案1】:

Enumerable.Distinct 扩展方法可以帮到你。

如果您不能使用默认值(EqualsMyList_Base 方法),则有一个 overload 和一个 IEqualityComparer。这可能是这种情况,例如您的 Equals 方法只会比较某些字段,但您可能希望检查所有字段。

【讨论】:

  • 要成为 IMO 的答案,您还应该解释 为什么 他需要 IComparer...
  • 谢谢,扩大了答案。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2018-05-16
    • 1970-01-01
    • 2014-09-30
    • 1970-01-01
    • 2023-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多