Zur ersten Spalte und erhalten unterscheidet sich von anderen Spalten
-
06-07-2019 - |
Frage
muss ich unter unterschiedlichen Zeilen von Textdatei Anzeige auszuwählen.
Textfile
123| one| two| three <br/>
124| one| two| four <br/>
125| one |two| three <br/>
Ausgabe sollte diesen
gefallen
123| one| two| three <br/>
124| one| two| four <br/>
oder
124| one| two| four <br/>
125| one |two| three <br/>
ich diesen Code bin mit diesem Problem zu arbeiten,
var readfile = File.ReadAllLines(" text file location ");
var spiltfile = (from f in readfile
let line = f.Split('|')
let y = line.Skip(1)
select (from str in y
select str).FirstOrDefault()).Distinct()
Danke
Lösung
Die unklare Abstand in der Frage hilft nicht ( insbesondere um die |two|
, die unterschiedlichen Abstand als der Rest hat, was bedeutet, wir brauchen Trimmen zu benutzen), aber hier ist einige Methoden benutzerdefinierte LINQ, die tun die Arbeit. Ich habe den Anon-Typen lediglich eine einfache Art und Weise der Verflachung den inkonsistenten Abstandes verwendet (I auch einen String wieder aufgebaut haben könnte, aber es schien nicht erforderlich)
Beachten Sie, dass ohne den ungeraden Abstand, so kann dieser einfach:
var qry = ReadLines("foo.txt")
.DistinctBy(line => line.Substring(line.IndexOf('|')));
Voll Code:
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
static class Program
{
static void Main()
{
var qry = (from line in ReadLines("foo.txt")
let parts = line.Split('|')
select new
{
Line = line,
Key = new
{
A = parts[1].Trim(),
B = parts[2].Trim(),
C = parts[3].Trim()
}
}).DistinctBy(row => row.Key)
.Select(row => row.Line);
foreach (var line in qry)
{
Console.WriteLine(line);
}
}
static IEnumerable<TSource> DistinctBy<TSource, TValue>(
this IEnumerable<TSource> source,
Func<TSource, TValue> selector)
{
var found = new HashSet<TValue>();
foreach (var item in source)
{
if (found.Add(selector(item))) yield return item;
}
}
static IEnumerable<string> ReadLines(string path)
{
using (var reader = File.OpenText(path))
{
string line;
while ((line = reader.ReadLine()) != null)
{
yield return line;
}
}
}
}
Andere Tipps
Schauen Sie sich diese, wird dies tun, was Sie tun möchten,
static void Main(string[] args)
{
string[] readfile = System.IO.File.ReadAllLines(@"D:\1.txt");
var strList = readfile.Select(x => x.Split('|')).ToList();
IEnumerable<string[]> noduplicates =strList.Distinct(new StringComparer());
foreach (var res in noduplicates)
Console.WriteLine(res[0] + "|" + res[1] + "|" + res[2] + "|" + res[3]);
}
Und implementieren die IEqualityComparer auf diese Weise
class StringComparer : IEqualityComparer<string[]>
{
public bool Equals(string[] x, string[] y)
{
if (Object.ReferenceEquals(x, y)) return true;
if (Object.ReferenceEquals(x, null) || Object.ReferenceEquals(y, null))
return false;
return x[1].Trim() == y[1].Trim() && x[2].Trim() == y[2].Trim() && x[3].Trim() == y[3].Trim() ;
}
public int GetHashCode(string[] data)
{
if (Object.ReferenceEquals(data, null)) return 0;
int hash1 = data[1] == null ? 0 : data[1].Trim().GetHashCode();
int hash2 = data[2] == null ? 0 : data[2].Trim().GetHashCode();
int hash3 = data[3] == null ? 0 : data[3].Trim().GetHashCode();
return hash1 ^ hash2 * hash3;
}
}
Es gibt u die Ausgabe wie erwartet.