2010-12-15 20 views
0

誰もが....これは非常に効率的に動作するようにlinqクエリを簡略化しますか?

FileCompareLength myFileCompare1 = new FileCompareLength(); 
var queryList1Only3 = (from file in list1 select file).Except(list2, myFileCompare1); 
var queryList1Only33 = (from file in list2 select file).Except(list1, myFileCompare1); 
var difference1 = queryList1Only3.ToHashSet(); 
difference1.SymmetricExceptWith(queryList1Only33); 
var query4 = difference1.AsEnumerable().OrderBy(x => x.Name); 
if (query4.Count() > 0) { 
    dest.WriteLine("Discrepancies in File Date:"); 
    foreach (var v in query4) { 
     dest.WriteLine(v.Lengh+ "  " + v.FullName); 
    } 
} 

public class FileCompareLength : System.Collections.Generic.IEqualityComparer<System.IO.FileInfo> { 
    public FileCompareLength() { } 
    public bool Equals(System.IO.FileInfo f1, System.IO.FileInfo f2) { 
     return (f1.Length == f2.Length); 
    } 

    public int GetHashCode(System.IO.FileInfo fi) { 
     return fi.Length.GetHashCode(); 
    } 
} 

どんな提案を簡素化することはできますか?

+1

。現在の形で見るのは辛いです。 –

+0

特に私がやったときから、linqに関することを知らずに読めるコードを作ることができるはずです。 –

+0

@bemace:ありがとうございました....... – bala3569

答えて

4

あなたの目標は、固有の長さを持つファイルのリストを取得することです。もしそうなら、私はハッシュセット(メモリが提供されていればとにかくカバーの下で使用されます)に行き、LINQをスキップします。

var uniqueFiles = new HashSet<FileInfo>(list1, new FileCompareLength()); 
uniqueFiles.SymmetricExceptWith(list2); 
//you should now have the desired list. 
//as mentioned in the comments, check for any items before sorting 
if (uniqueFiles.Any()) 
{ 
    for (var file in uniqueFiles.OrderBy(x => x.Name)) 
    { 
     //do stuff with file 
    } 
} 

あなたがHashSetのを使用する場合は、あなたも、それはそれはあなたの例で行ったように、コレクション全体を反復伴わないためカウント使用することができますが、私はどれ搬送する意図は全く同じようにして劣化しにくくなることを見つけます他の場所での小さな変更によるパフォーマンス。

+0

working good ... – bala3569

1

コードを調べた後、私はあなたが難解な方法を使用していることがわかります。 FileInfo.Lengthを比較しているので、例としてint[]を使用します。さんが言ってみましょう:

list1: 1 2 2 5 5 7 (the numbers are lengths of files) 
list2: 2 3 4 7 
list1 except list2(called e1): 1 5 5 
list2 except list1(called e2): 3 4 
SymmetricExceptWith: 1 5 5 3 4 (always e1+e2 because e1/e2 comes from Except) 

のようにこのようにコードを向上させることができます:私はあなたには、いくつかのより多くの文明インデントで始まり示唆

var common = list1.Intersect(list2, myFileCompare1); 
var exclusive = list1.Concat(list2).Where(x => !common.Contains(x)) 
            .OrderBy(x => x.Name); 
+0

私は異なる長さのファイルが必要です – bala3569

関連する問題