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

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top