Linq判断List<List<T>>中的重复项
导入Excel之前要检查一遍,看是否有重复的行等错误,多个模块有导入功能,我就想干脆写下面这样一个类,用来记录待导入文件中的错误:
- C# code
public class ImportLog { /// <summary> /// Excel行号 /// </summary> public int RowID { get; set; } /// <summary> /// 当前行中每个单元格的值 /// </summary> public List<object> FieldList { get; set; } /// <summary> /// 是否包含错误 /// </summary> public bool HasError { get; set; } /// <summary> /// 错误信息 /// </summary> public string ErrorMsg { get; set; } }先拿“检查重复的行”来试试:
- C# code
public List<ImportLog> GetRepeatedRows(List<ImportLog> list = null) { if (list == null) { list = new List<ImportLog>() { new ImportLog(){ RowID=1, FieldList=new List<object>(){"1","11","111"}, ErrorMsg=""}, new ImportLog(){ RowID=2, FieldList=new List<object>(){"1","11","111"}, ErrorMsg=""}, new ImportLog(){ RowID=3, FieldList=new List<object>(){"1","11","111","1111"}, ErrorMsg=""}, new ImportLog(){ RowID=4, FieldList=new List<object>(){"1","11","111","1112"}, ErrorMsg=""}, new ImportLog(){ RowID=5, FieldList=new List<object>(){"1","11","112","1121"}, ErrorMsg=""}, new ImportLog(){ RowID=6, FieldList=new List<object>(){"1","11","112","1121"}, ErrorMsg=""}, new ImportLog(){ RowID=7, FieldList=new List<object>(){"1","12","121","1211"}, ErrorMsg=""}, new ImportLog(){ RowID=8, FieldList=new List<object>(){"1","12","122","1221"}, ErrorMsg=""}, new ImportLog(){ RowID=9, FieldList=new List<object>(){"1","13","131","1311"}, ErrorMsg=""}, new ImportLog(){ RowID=10, FieldList=new List<object>(){"2","21","211","2111"}, ErrorMsg=""}, new ImportLog(){ RowID=11, FieldList=new List<object>(){"2","21","211","2111"}, ErrorMsg=""}, new ImportLog(){ RowID=11, FieldList=new List<object>(){"2","21","211","2111"}, ErrorMsg=""}, }; } //方式1:成功,但效率貌似不高 //var ret1 = list.FindAll(a => list.FindAll(b => b.FieldList.Intersect(a.FieldList).Count() == a.FieldList.Count).Count > 1); //方式2:group by m.FieldList into g 失败 var ret2 = (from t in list where ( from d in ( from m in list group m by m.FieldList into g where g.Count() > 1 select g ) select d.Key ).Contains(t.FieldList) select t).ToList(); var count = ret2.Count;//count=0 …… return ret2; }各位大神,谁能给优化一下方式1,再给改改方式2?
拜谢!
呃,准备下班了,明天上午来了给分,见谅……
[解决办法]
- C# code
var ret2=list.GroupBy(l=>string.Join(",",l.FieldList.OrderBy(x=>x).Select(x=>x.ToString()).ToArray())) .Where(g=>g.Count()>1);
[解决办法]
我尝试也写了一个,不知道符不符合要求。
var result = list.GroupBy(L => L.RowID).Select(G => G.First()).ToList();