2013-05-30 51 views
1

我有两个列表,我试图比较值,但问题是一个是List<string>类型,另一个是List<SelectListItem>类型。LINQ-ify比较检查

这就是我目前的工作正常,但我觉得这样一个简单的比较检查有很多开销。

List<SelectListItem> fullSubjects = SubRepo.GetSubjects(); 

//Create our custom list based off the diff 
Manage.UserCustomSubjects = Manage.UserSubjects.Where(item => !StaticReferenceList.Contains(item)).ToList(); 
foreach (var s in Manage.UserCustomSubjects) 
{ 
     var checkval = fullSubjects.FirstOrDefault(t => t.Text == s); 
     if (checkval == null) 
     { 
      var additem = new SelectListItem(); 
      additem.Text = s; 
      additem.Value = s; 
      fullSubjects.Add(additem); 
     } 
} 

这里的总体目标是创建没有任何重复值的fullSubjects列表。

任何关于如何清理这个问题的建议,或者可能LINQ比较?

+0

你意味着它是'fullSubjects.FirstOrDefault(T => t.Text == s.Text);'?你看过'Distinct()'扩展方法吗? –

+0

您的描述与您的代码不符。如果您只是将项目添加到'fullSubjects',您希望如何“没有重复”? –

+0

@JeffBridgman - 我相信特定的行是正确的,因为's'是一个字符串值,所以't.Text'也是如此。我确实看过Distinct(),但问题是'GetHasCode'的底层比较对于'SelectItemList.Text'和's'是不同的。 – X3074861X

回答

1

以下是一种方法。我把它弄坏了,所以它更容易理解。

List<SelectListItem> fullSubjects = SubRepo.GetSubjects(); 

//Create our custom list based off the diff 
Manage.UserCustomSubjects = Manage.UserSubjects.Where(item => !StaticReferenceList.Contains(item)).ToList(); 

var diff= Manage.UserCustomSubjects.Except(fullSubjects.Select(fs=>fs.Text)); 
var combined=fullSubjects.Union(diff.Select(d=>new SelectListItem {Text=d,Value=d})); 

缩短:

var fullSubjects = SubRepo.GetSubjects().Union(Manage.UserSubjects.Where(item => !StaticReferenceList.Contains(item)).ToList().Except(fullSubjects.Select(fs=>fs.Text)).Select(d=>new SelectListItem {Text=d,Value=d})); 
+0

这很好。使用'.Except()'和'.Union()'正是我在这里所需要的。谢谢! – X3074861X