所以这是我需要修改的代码部分。我需要做到这一点,以便不会有任何重复,但在第二列的文件中应该创建一个数字,它被发现重复多少次。它应该如下所示:https://imgur.com/a/KpUbf
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);
}
}
}
答案 0 :(得分:2)
我会使用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);
}
答案 1 :(得分:2)
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
希望对你有所帮助
答案 2 :(得分:1)
现在真的......
if(!results.Contains(ring)){
results.Add(ring);
writer....
} else {
duplicates++;
}
其中'duplicates'将是您的计数重复计数器。从0开始。
答案 3 :(得分:1)
首先,你需要Ring实现Equals()并拥有一个不错的GetHashCode()。然后使用值为count的Dictionary。这不是花哨,但很清楚。
答案 4 :(得分:0)
在开始创建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;
}
}
}
}