Linqコレクション処理(Union)
12522 ワード
ユニオンの2つのケースについて
一、単純値タイプ又はstringタイプの処理方式(集合はIEnumerableインタフェースを実現する必要がある)
二、参照タイプ(カスタムクラスタイプ)では、独自の比較方法を定義する必要があります.そうしないと、コンパイラはデフォルトの比較オブジェクトの適用タイプで、必要な結果が得られない場合があります.
1:まず比較タイプを定義する必要があり、IEqualityComparerまたはそのリペアインタフェースを実装する必要があるIEqualityComparer
a:たとえば、カスタムクラスがあります.Union操作を確立します.このタイプは次のように定義されています.
b:カスタム比較タイプは以下の通りです.
2:Userオブジェクトの集合に対するUnion関係を確立する(カスタムEntityComparerを適用):
一、単純値タイプ又はstringタイプの処理方式(集合はIEnumerableインタフェースを実現する必要がある)
#region int
List<int> ints1 = new List<int> { 1, 2, 3, 4, 5, 6 };
List<int> ints2 = new List<int> { 5, 6, 7, 8, 9, 0 };
IEnumerable<int> intsResult = ints1.Union(ints2).OrderBy(c => c);
// 0, 1, 2, 3, 4, 5, 6, 7, 8, 9
#endregion
#region string
List<string> str1 = new List<string> { "str1", "str2", "str3", "str4", "str5", "str6" };
List<string> str2 = new List<string> { "str5", "str6", "str7", "str8", "str9", "str0" };
IEnumerable<string> strResult = str1.Union(str2).OrderBy(c => c);
// str0, str1, str2, str3, str4, str5, str6, str7, str8, str9
#endregion
二、参照タイプ(カスタムクラスタイプ)では、独自の比較方法を定義する必要があります.そうしないと、コンパイラはデフォルトの比較オブジェクトの適用タイプで、必要な結果が得られない場合があります.
1:まず比較タイプを定義する必要があり、IEqualityComparerまたはそのリペアインタフェースを実装する必要があるIEqualityComparer
a:たとえば、カスタムクラスがあります.Union操作を確立します.このタイプは次のように定義されています.
public class User
{
public string ID { get; set; }
public string Name { get; set; }
public string Grade { get; set; }
public int CompareTo(User stu)
{
if (stu == null)
throw new ArgumentNullException("stu");
return Grade.CompareTo(stu.Grade);
}
}
b:カスタム比較タイプは以下の通りです.
/// <summary>
///
/// </summary>
public class EntityComparer : IEqualityComparer<User>
{
public bool Equals(User a, User b)
{
if (Object.ReferenceEquals(a, b)) return true;
if (Object.ReferenceEquals(a, null) || Object.ReferenceEquals(b, null))
return false;
return a.ID == b.ID && a.Name == b.Name && a.Grade == b.Grade;
}
public int GetHashCode(User a)
{
if (Object.ReferenceEquals(a, null)) return 0;
int hashName = a.Name == null ? 0 : a.Name.GetHashCode();
int hashCode = a.Grade.GetHashCode();
return hashName ^ hashCode;
}
}
2:Userオブジェクトの集合に対するUnion関係を確立する(カスタムEntityComparerを適用):
#region
IEnumerable<User> list1 = new List<User> { new User { ID = "0003", Name = " ", Grade = " " }, new User { ID = "0002", Name = " ", Grade = " " } };
IEnumerable<User> list2 = new List<User> { new User { ID = "0003", Name = " ", Grade = " " }, new User { ID = "0004", Name = " ", Grade = " " } };
IEqualityComparer<User> ec = new EntityComparer();
//1: Union
//IEnumerable<TSource> Union<TSource>(this IEnumerable<TSource> first, IEnumerable<TSource> second, IEqualityComparer<TSource> comparer)
IEnumerable<User> users1 = list1.Union(list2,ec).OrderBy(c=>c.ID);
//IEnumerable<TSource> Distinct<TSource>(this IEnumerable<TSource> source, IEqualityComparer<TSource> comparer)
//2: Concat, distinct
IEnumerable<User> users2 = list1.Concat(list2).Distinct(ec).OrderBy(c => c.ID);
foreach (User item in users2)
Console.WriteLine("ID:{0,-7}Name:{1,-5}Grade:{2}", item.ID, item.Name, item.Grade);
/*
ID = "0002", Name = " ", Grade = " "
ID = "0003", Name = " ", Grade = " "
ID = "0004", Name = " ", Grade = " "
*/