如何通过 linq 或 lambda 获取不同的值?
How to getting distinct values by linq or lambda?
我有一个项目列表,我尝试通过不同的键获取唯一的项目。
class:
class TempClass
{
public string One { get; set; }
public string Two { get; set; }
public string Key
{
get
{
return "Key_" + One + "_" + Two;
}
}
}
我按如下方式构建虚拟列表:
List<TempClass> l = new List<TempClass>()
{
new TempClass(){ One="Da" , Two = "Mi"},
new TempClass(){ One="Da" , Two = "Mi"},
new TempClass(){ One="Da" , Two = "Mi"},
new TempClass(){ One="Mi" , Two = "Da"},
new TempClass(){ One="Mi" , Two = "Da"},
};
我的问题是 - 如何只获得 1 件物品?通过检查是否只存在唯一键?唯一项意味着应该检查是否只有一个等于 "Key_Da_Mi" 或 "Key_Mi_Da"?
的键
如何实现?
您应该实施相等比较,或者根据您的特定逻辑实施IEqualityComparer<T>
:
class TempClassEqualityComparer : IEqualityComparer<TempClass>
{
public bool Equals(TempClass x, TempClass y)
{
if (Object.ReferenceEquals(x, y)) return true;
if (Object.ReferenceEquals(x, null) || Object.ReferenceEquals(y, null))
return false;
// For comparison check both combinations
return (x.One == y.One && x.Two == y.Two) || (x.One == y.Two && x.Two == y.One);
}
public int GetHashCode(TempClass x)
{
if (Object.ReferenceEquals(x, null)) return 0;
return x.One.GetHashCode() ^ x.Two.GetHashCode();
}
}
然后你可以在Distinct
方法中使用这个比较器:
var result = l.Distinct(new TempClassEqualityComparer());
只需在创建密钥之前订购它们。
public string Key
{
get{
List<string> l = new List<string>{One, Two};
l = l.OrderBy(x => x).ToList();
return "Key_" + string.Join("_", l);
}
}
将每个项目分组到包含两个键的 HashSet
字符串中,使用 HashSet 的集合比较器将项目作为集合进行比较(集合是无序的),然后从中取出第一个(或任何一个)项目每组:
var distinct = l.GroupBy(item => new HashSet<string>() { item.One, item.Two },
HashSet<string>.CreateSetComparer())
.Select(group => group.First());
我有一个项目列表,我尝试通过不同的键获取唯一的项目。 class:
class TempClass
{
public string One { get; set; }
public string Two { get; set; }
public string Key
{
get
{
return "Key_" + One + "_" + Two;
}
}
}
我按如下方式构建虚拟列表:
List<TempClass> l = new List<TempClass>()
{
new TempClass(){ One="Da" , Two = "Mi"},
new TempClass(){ One="Da" , Two = "Mi"},
new TempClass(){ One="Da" , Two = "Mi"},
new TempClass(){ One="Mi" , Two = "Da"},
new TempClass(){ One="Mi" , Two = "Da"},
};
我的问题是 - 如何只获得 1 件物品?通过检查是否只存在唯一键?唯一项意味着应该检查是否只有一个等于 "Key_Da_Mi" 或 "Key_Mi_Da"?
的键如何实现?
您应该实施相等比较,或者根据您的特定逻辑实施IEqualityComparer<T>
:
class TempClassEqualityComparer : IEqualityComparer<TempClass>
{
public bool Equals(TempClass x, TempClass y)
{
if (Object.ReferenceEquals(x, y)) return true;
if (Object.ReferenceEquals(x, null) || Object.ReferenceEquals(y, null))
return false;
// For comparison check both combinations
return (x.One == y.One && x.Two == y.Two) || (x.One == y.Two && x.Two == y.One);
}
public int GetHashCode(TempClass x)
{
if (Object.ReferenceEquals(x, null)) return 0;
return x.One.GetHashCode() ^ x.Two.GetHashCode();
}
}
然后你可以在Distinct
方法中使用这个比较器:
var result = l.Distinct(new TempClassEqualityComparer());
只需在创建密钥之前订购它们。
public string Key
{
get{
List<string> l = new List<string>{One, Two};
l = l.OrderBy(x => x).ToList();
return "Key_" + string.Join("_", l);
}
}
将每个项目分组到包含两个键的 HashSet
字符串中,使用 HashSet 的集合比较器将项目作为集合进行比较(集合是无序的),然后从中取出第一个(或任何一个)项目每组:
var distinct = l.GroupBy(item => new HashSet<string>() { item.One, item.Two },
HashSet<string>.CreateSetComparer())
.Select(group => group.First());