1

我先道歉,因为我现在意识到我完全用错了我的例子。对于那些做出回应的人,我真的很感激。请让我重新尝试以更准确的细节进行解释。请编辑您的回复,对于我之前的帖子没有更准确,我再次表示歉意。

使用名为 Staging 的实体框架模型类(它是我的 Staging 表的表示形式),我有以下List<Staging>.

List<Staging> data = (from t in database.Stagings select t).ToList();
//check for an empty List...react accordingly...

快速浏览一下Staging外观:

public partial class Staging
{
    public int ID { get; set; }        //PK
    public int RequestID { get; set; } //FK
    ...
    public string Project { get; set; }
    ...
}

让我们假设查询将 10 条记录返回到我的data列表中。让我们还假设data[3],data[6]data[7]中的每个都具有相同的值data.Project,比方说"Foo"。该data.Project值直到运行时才知道。

鉴于此,我将如何保留第一次出现 ,并data[3]从我的?data[6]data[7]List<Staging>

编辑: 我有以下有效的代码,但还有其他方法吗?

  HashSet<string> projectValuesFound = new HashSet<string>();
  List<Staging> newData = new List<Staging>();

  foreach (Staging entry in data)
  {
    if (!projectValuesFound.Contains(entry.Project))
    {
      projectValuesFound.Add(entry.Project);
      newData.Add(entry);
    }
  }
4

4 回答 4

2

您可以通过 LINQ 和 a 执行此操作HashSet<T>

var found = new HashSet<string>();
var distinctValues = theList.Where(mc => found.Add(mc.Var3));

// If you want to assign back into the List<T> again:
// theList = distinctValues.ToList();

这是有效的,因为HashSet<T>.Add如果值不在集合中,则返回 true,如果它已经存在,则返回 false。因此,您只会获得Var3.

于 2013-02-15T17:32:24.777 回答
0

做到这一点的“规范”方法是将适当实施的比较器传递给Distinct

class Var3Comparer : IEqualityComparer<MyClass> {
    public int GetHashCode(MyClass obj) {
        return (obj.Var3 ?? string.Empty).GetHashCode();
    }
    public bool Equals(MyClass x, MyClass y) {
        return x.Var3 == y.Var3;
    }
}

// ...

var distinct = list.Distinct(new Var3Comparer());

请注意,虽然当前的实现似乎保持“幸存”元素的顺序,但文档说它“返回无序序列”并且最好以这种方式处理。

还有一个不需要比较器的 Distinct 重载 - 它只是假定默认比较,如果由.MyClass

于 2013-02-15T17:58:01.490 回答
0

你可以使用 Linq:

var result = (from my in theList where my.Var3 == "Foo" select my).First();

如果您还想保留其他项目,可以使用Distinct()而不是 First()。要使用 Dictinct(),要么MyClass必须实现IEquatable<T>,要么必须提供IEqualityComparer<T>MSDN 链接中所示的。

于 2013-02-15T17:31:44.153 回答
0
var uniques = (from theList select theList.Var3).Distinct();

这将为您提供所有条目的不同值。

于 2013-02-15T17:35:23.330 回答