创建CSV文件时避免重复
所以这是我需要修改的代码的一部分。我需要使它不会有任何重复,但是在第二列的文件中也应该创建一个数字,它被发现有多少次是重复的。它应该是这样的:https://imgur.com/a/KpUbf创建CSV文件时避免重复
private static void SaveDataToFile(List<Ring> rings)
{
using (StreamWriter writer = new StreamWriter(@"Metalai.csv"))
{
List<Ring> results = new List<Ring>();
writer.WriteLine("Metalai");
foreach (var ring in rings)
if (!results.Contains(ring))
{
writer.WriteLine("{0}", ring.Metalas);
}
}
}
的LABAs draugas,我认为你正在寻找这样的事情,
static void Main(string[] args)
{
List<Ring> rings = new List<Ring>();
rings.Add(new Ring { Id = 1, Name = "siauliai", Metalas = "s" });
rings.Add(new Ring { Id = 2, Name = "kaunas", Metalas = "k" });
rings.Add(new Ring { Id = 3, Name = "vilnius", Metalas = "v" });
rings.Add(new Ring { Id = 4, Name = "klapedia", Metalas = "ka" });
rings.Add(new Ring { Id = 5, Name = "siauliai", Metalas = "s" });
SaveDataToFile(rings);
Console.ReadKey();
}
private static void SaveDataToFile(List<Ring> rings)
{
using (StreamWriter writer = new StreamWriter(@"Metalai.csv"))
{
List<string> ringMetalas = new List<string>();
writer.WriteLine("Metalai;Duplication");
foreach (var ring in rings)
{
if (!ringMetalas.Contains(ring.Metalas))
{
var duplicationCount = rings.Count(r => r.Metalas == ring.Metalas);
ringMetalas.Add(ring.Metalas);
var mesage = $"{ring.Metalas}";
if (duplicationCount > 1)
mesage += $";{duplicationCount}";
writer.WriteLine("{0}", mesage);
}
}
}
}
结果像;
Metalai Duplication
s 2
k
v
ka
希望它能够对您有帮助
Oho dekui! *下降*:3 –
现在真的...
if(!results.Contains(ring)){
results.Add(ring);
writer....
} else {
duplicates++;
}
其中 '重复' 将你的计数器的计数重复。从0开始。
但是,将显示一个数字旁边的重复.csv文件? –
此文件仍然显示重复,所以没有任何改变。 –
@RenatasKarnauskas“但是,将在.csv文件中显示重复旁边的数字吗?” - 不,它不会,它只显示重复的总数。对不起,误解您的需求 – tevemadar
在开始创建csv文件以降低计算工作量之前,请考虑排序环。在已排序的情况下,您知道重复项会显示为彼此相邻,因此,在编写环(15)时,您只需确认环(14)不重复。否则,你需要通过整个环变量ech和每一次增加努力。
所以对于分类情况下,这可能是一个解决方案:
private static void SaveDataToFile(List<Ring> rings)
{
using (StreamWriter writer = new StreamWriter(@"Metalai.csv"))
{
List<Ring> results = new List<Ring>();
writer.WriteLine("Metalai");
String oldRing = String.empty;
int duplicates = 0;
foreach (var ring in rings)
if (!results.Contains(ring))
{
if (ring.Metalas == oldRing)
{
Console.WriteLine("{0}", ring.Metalas);
duplicates++;
}
else
{
writer.WriteLine("{0}", ring.Metalas);
oldRing = ring.Metalas;
}
}
}
}
首先你要环来实现equals()和有一个体面的GetHashCode()。然后使用值为count的字典。这不是幻想,但它很清楚。
我会用HashSet<Ring>
来代替它,因为它效率更高。您需要覆盖Equals
和GetHashCode
中的Ring
和/或执行IEquatable<Ring>
。
但是,你也可以用这个简单的方法:
private static void SaveDataToFile(List<Ring> rings)
{
var metalasLookup = rings.ToLookup(r => r.Metalas);
using (StreamWriter writer = new StreamWriter(@"Metalai.csv"))
{
writer.WriteLine("Metalai");
foreach (var metalasGroups in metalasLookup)
{
int count = metalasGroups.Count();
string = line $"{metalasGroups.Key},{(count == 0 ? "" : count.ToString())}";
writer.WriteLine(line);
}
}
}
或用非常简洁的版本:
static void SaveDataToFile(List<Ring> rings)
{
var lines = rings.ToLookup(r => r.Metalas).Select(x => $"{x.Key},{(x.Any() ? x.Count().ToString() : "")}");
File.WriteAllLines(@"Metalai.csv", lines);
}
它仍然不起作用。它应该看起来像删除重复项,而且在下一个collumn节目中显示它重复了多少次。这张照片应该是这样的:https://imgur.com/a/KpUbf –
您可以尝试使用LINQ组和计算每个组 – daniell89
中的元素如何将看起来像exacly?我相当新的C#,所以我不是那么好 –