【问题标题】:C# Lists => Remove objects where a property does not exist in another listC# Lists => 删除另一个列表中不存在属性的对象
【发布时间】:2014-02-27 18:25:46
【问题描述】:

我有 2 个相同类型的列表(结果)。 两个列表都填充了唯一的数据集,但可能包含也可能不包含公共属性,例如:(Results.TitleName)。

我的问题是,对于每个列表都返回一个 ICollection,我如何从每个列表中删除另一个列表不包含 Results.TitleName 的项目。

任何帮助将不胜感激。但请记住,我可能正在处理一个相当大的数据集,因此应该考虑性能。

var Results1 = ResultsRepository.GetPoints(FirstElement);

var Results2 = ResultsRepository.GetPoints(SecondElement);

public ICollection<Results> GetPoints(string element)
{
  if (element == null)
  {
    //Exception
  }

  using (ISession session = OpenSession())
  {
    try
    {
      return session.CreateQuery(HQL Query)
        .List<Results>();
    }
    catch (Exception ex)
    {
      //Exception
    }
  }

}

ResultsRepository 是一个 NHibernate 域: 使用系统;

public class Results
{
    /// <summary>
    /// Unique Sample Number
    /// </summary>
    public virtual string SampleNumber { get; set; }

    /// <summary>
    /// Result Title name
    /// </summary>
    public virtual string TitleName{ get; set; }
}

干杯

【问题讨论】:

  • 您应该发布您正在使用的代码。向您展示如何调整不起作用的东西比展示一个空白的示例要容易得多。
  • 我已将代码 sn-ps 添加到初始帖子中。

标签: c#-4.0 ilist icollection


【解决方案1】:

试试下面的

List<Results> list1 = ...;
List<Results> list2 = ...;
list1.Remove(x => !list2.Any(y => y.TitleName != x.TitleName);

如果您有一个非常大的数据集,此查找可能太慢,因此HashSet&lt;T&gt; 可能更可取。

var set = new HashSet<string>(list2.Select(x => x.TitleName);
list1.Remove(x => !set.Contains(x.TitleName));

【讨论】:

  • 我在这里遗漏了一些东西,x.TitleName 在这两种情况下都无效。有什么想法吗?
  • @AllStar11 你能把定义发布到Result,以便我们了解如何从他们那里得到TitleName吗?
  • 完成。请参阅初始帖子中的编辑。干杯!
  • @AllStar11 重命名为使用Results 类型而不是Result
  • 我仍然无法访问以下 sn-p 中 x 的任何成员:y => y.TitleName != x.TitleName OR !set.Contains(x.TitleName)
猜你喜欢
  • 2015-07-23
  • 1970-01-01
  • 2018-02-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-02
  • 1970-01-01
相关资源
最近更新 更多